Статическое свойство ConcurrencyMode.Multiple и WebOperationContext.Current - PullRequest
2 голосов
/ 30 июня 2011

У меня есть служба WCF с опцией ConcurrencyMode = ConcurrencyMode.Multiple.Могу ли я безопасно прочитать заголовки HTTP входящих запросов и установить заголовки исходящих ответов, учитывая тот факт, что запросы на обслуживание обрабатываются одновременно?Я сомневаюсь, потому что WebOperationContext.Current является глобальным государством.Проверяет ли текущий поток?

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

ConcurrencyMode.Multiple имеет смысл, только если у вас есть экземпляр, который позволяет совместно использовать экземпляр службы. В случае службы REST у вас, скорее всего, нет такого экземпляра (если вы не используете одноэлементный сервис), и у вас не должно быть такого экземпляра (поскольку сервис REST не поддерживает состояние - все состояние передается в запросе). *

Служба REST использует каждый экземпляр запроса, и каждый запрос обслуживается новым потоком (из пула потоков) и новым экземпляром класса обслуживания автоматически. Вам не нужен этот параметр вообще.

WebOperationContext.Current извлекает текущий контекст из статической переменной частного потока внутри контекста, чтобы он не распределялся между потоками.

0 голосов
/ 30 июня 2011

Ну, и да, и нет. Свойство WebOperationContext.Current действительно поточно-ориентировано.Однако члены экземпляра возвращенного объекта WebOperationContext не являются.Это означает, что вам придется самостоятельно управлять синхронизацией в вашем методе обслуживания.

Вот что MSDN говорит о ConcurrencyMode.Multiple :

Экземпляр службы имеет несколько-threaded.Никаких гарантий синхронизации не сделано.Поскольку другие потоки могут изменить ваш сервисный объект в любое время, вы должны постоянно обрабатывать синхронизацию и согласованность состояний.

Тогда ваша реализация сервиса может выглядеть примерно так:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyService : IMyService
{
    private Object syncObject = new Object();

    public void MyServiceOperation()
    {
        lock (this.syncObject)
        {
            // Service implementation
        }
    }
}
...