Группировка одинаковых запросов WCF - PullRequest
4 голосов
/ 09 августа 2010

Если служба WCF получает один и тот же запрос, это означает, что один и тот же MD5 по всем параметрам, я хочу заблокировать все, кроме первого запроса, пока не будет завершена обработка и уведомить всех ожидающих клиентов.

Как лучше всего это сделать?Мне кажется, что-то вроде приемника канала, может быть есть законченная реализация для архивирования этого?

Ответы [ 2 ]

1 голос
/ 09 августа 2010

Я не уверен в том, что было бы «лучшим» соответствием для архитектуры 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 , который делает что-то похожее в строках кэширования ответов, основанных на запросе, но без шагов синхронизации, так что вы, вероятно, можете посмотреть, что я сделал, и изменить это соответственно для достижения того, что вы после.

0 голосов
/ 09 августа 2010

Сначала я подумываю о пользовательской реализации для хеш-таблицы, которая будет обрабатывать MD% и искать его до начала обработки нового запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...