如果WCF服务获得相同的请求,则表示除了第一个请求之外我想要阻止所有参数的相同MD5,直到处理完成并通知所有等待的客户端。
这样做的最佳方式是什么?我有点像通道下沉的东西,也许有一个完成的实现来实现这个?
答案 0 :(得分:1)
我不确定什么是适合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属性,根据请求缓存响应但没有同步步骤,所以你可能会看看我做了什么并相应地修改它实现你所追求的目标。
答案 1 :(得分:0)
首先,我想到一个哈希表的自定义实现,以便在开始新的请求处理之前保持MD%的处理和查找。