c# – 对相同的WCF请求进行分组
发布时间:2020-12-15 21:09:11 所属栏目:百科 来源:网络整理
导读:如果WCF服务获得相同的请求,则意味着相同的MD5超过所有参数我想阻止除第一个请求之外的所有参数,直到处理完成并通知所有等待的客户端. 这样做的最佳方式是什么?我有点像通道下沉的东西,也许有一个完成的实现来实现这个? 解决方法 我不确定什么是最适合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属性,根据请求在没有同步步骤的缓存响应行中做了类似的事情,所以你可以看看我做了什么并相应地修改它以实现你所追求的目标. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |