Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分组相同的WCF请求_C#_Wcf - Fatal编程技术网

C# 分组相同的WCF请求

C# 分组相同的WCF请求,c#,wcf,C#,Wcf,如果WCF服务收到相同的请求,则意味着在所有参数上都有相同的MD5,我要阻止除第一个请求之外的所有请求,直到处理完成并通知所有等待的客户端 最好的方法是什么?我有一个类似于信道接收器的东西,也许有一个芬兰的实现来归档这个?首先,我正在考虑一个哈希表的自定义实现,以便在开始一个新的请求处理之前保持对MD %s的处理和查找。 < P>我不确定什么是WCF体系结构的“最佳”适合,但是您应该考虑将您设置为单机,因为您可能正在执行许多同步步骤。你想在这里做什么 像这样的怎么样?显然,您需要对字典本身进行一

如果WCF服务收到相同的请求,则意味着在所有参数上都有相同的MD5,我要阻止除第一个请求之外的所有请求,直到处理完成并通知所有等待的客户端


最好的方法是什么?我有一个类似于信道接收器的东西,也许有一个芬兰的实现来归档这个?

首先,我正在考虑一个哈希表的自定义实现,以便在开始一个新的请求处理之前保持对MD %s的处理和查找。

< P>我不确定什么是WCF体系结构的“最佳”适合,但是您应该考虑将您设置为单机,因为您可能正在执行许多同步步骤。你想在这里做什么

像这样的怎么样?显然,您需要对字典本身进行一些同步,但至少这是一个开始

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; }
}
专用IDictionary请求令牌=
新字典();
公共MyResponse MyMethod(MyRequest-request)
{
//获取请求的MD5
var md5=GetMD5Hash(请求);
//检查另一个线程是否正在处理/已处理相同的请求
请求令牌;
if(RequestTokens.TryGetValue(md5,out令牌))
{
//如果令牌已经存在,则等待我们获得锁
//这表示处理已完成,响应已准备就绪
//供我们重复使用
锁(token.Sync)
{
返回token.Response;
}
}
其他的
{
var令牌=新令牌(md5);
锁(token.Sync)
{
Add(md5,token);
//在这里进行处理。。
var响应=。。。。
响应=响应;
返回响应;
}
}
}
私有类请求令牌
{
私有只读对象_sync=新对象();
公共请求令牌(字符串md5)
{
MD5=MD5;
}
公共字符串MD5{get;private set;}
公共对象同步{get{return\u Sync;}}
公共MyResponse响应{get;set;}
}
对我来说,这是我想从我的业务逻辑中抽象出来的东西,我个人将使用PostSharp并编写一个小属性来处理所有这些


我编写了一个属性,它在基于请求的缓存响应行中执行类似的操作,但没有同步步骤,因此您可能可以查看我所做的操作,并相应地修改它以实现您的目标。

是的。这是合乎逻辑的。我感兴趣的问题是如何有效地阻止线程以及钩住哪个事件。也许有一种聪明的方法可以完美地融入WCF架构。假设这是一个极其昂贵的操作,需要一个复杂的、跨请求的协调系统,这是正确的吗?是的。一个请求需要几秒钟才能完成,并且无法缓存。这是最简单的方法,可以肯定有效。但这正是我想要阻止的。我正在寻找一种高效的方法,能够每秒处理1000个或更多请求。在第一个请求完成之前,您真的需要使用相同的MD5校验和阻止所有后续请求吗?这种同步显然会影响到您可以通过服务推送多少并发性。此外,您很可能需要跨多台计算机进行扩展,以便能够每秒处理1000多个请求,尤其是在您的操作非常昂贵的情况下。而要在机器上做你想做的事情,又是另一件怪事!我不想横穿机器。我认为这是低效的。我知道,由于调用我的服务的第三方系统设计糟糕,多个呼叫(>100)同时击中了我。