c# – 对相同的WCF请求进行分组

如果WCF服务获得相同的请求,则意味着相同的MD5超过所有参数我想阻止除第一个请求之外的所有参数,直到处理完成并通知所有等待的客户端.

这样做的最佳方式是什么?我有点像通道下沉的东西,也许有一个完成的实现来实现这个?

解决方法

我不确定什么是最适合WCF架构的,但你应该考虑将你的 InstanceContextMode设置为Single,因为你很可能在这里做了很多同步步骤.

这样的事怎么样?你显然需要在字典本身上做一些同步,但至少它是一个开始.

private IDictionary<string,RequestToken> RequestTokens = 
   new Dictionary<string,RequestToken>();

public MyResponse MyMethod(MyRequest request)
{
   // get the MD5 for the request
   var md5 = GetMD5Hash(request);

   // check if another thread is processing/has processed an identical request
   RequestToken token;
   if (RequestTokens.TryGetValue(md5,out token))
   {
      // if the token exists already then wait till we can acquire the lock
      // which indicates the processing has finished and a response is ready
      // for us to reuse
      lock (token.Sync)
      {
         return token.Response;
      }
   }
   else
   {
      var token = new Token(md5);
      lock (token.Sync)
      {
         RequestTokens.Add(md5,token);

         // do processing here..
         var response = ....

         token.Response = response;

         return response;
      }
   }
}

private class RequestToken
{
   private readonly object _sync = new object();

   public RequestToken(string md5)
   {
      MD5 = md5;
   }

   public string MD5 { get; private set; }

   public object Sync { get { return _sync; } }

   public MyResponse Response { get; set; }
}

对我来说,这是我想要从业务逻辑中抽象出来的东西,我个人会使用PostSharp并写一个属性来处理所有这些.

我写了一个Memoizer属性,根据请求在没有同步步骤的缓存响应行中做了类似的事情,所以你可以看看我做了什么并相应地修改它以实现你所追求的目标.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...