Только доступ к сеансу в сеансе веб-службы?

У нас есть веб-служба .net asmx, которая вызывается из javascript (с использованием ASP.Net AJAX) и требует доступа к сеансу.

[WebMethod(true)]
public string DoSomethingOnTheServer() { }

Мы столкнулись с проблемой блокировки сессии по запросу чтения/записи. Есть ли способ маркировать метод веб-службы, требующий доступа только на чтение к сеансу?

Спасибо!

Ответ 1

Это действительно старый поток, но я наткнулся на него в поисках ответа на тот же вопрос.

Я нашел ответ еще где, и оставит его здесь для других интернетов на моем месте:

В Global.asax вы можете указать для каждого запроса, какой доступ должен иметь запрос к объекту сеанса, и тем самым блокировать его или нет.

private void Application_BeginRequest(object sender, EventArgs e)
{
    // This will set the session to read only for asmx services
    // This will make the asmx services non blocking for other requests as it doesnt lock the session object
    if (Context.Request.Path.Contains(".asmx/"))
    {
        Context.SetSessionStateBehavior(SessionStateBehavior.ReadOnly);
    }
}

Таким образом, службы asmx всегда имеют доступ только для чтения к сеансу и не будут блокировать другие запросы

Ответ 2

Эта http://msdn.microsoft.com/en-us/library/aa480509.aspx страница, кажется, предполагает, что ответ "нет" - вы не можете пометить WebSerivce как имеющий EnableSessionState=ReadOnly.

Если вы выполняете одновременные вызовы веб-службы из одного и того же процесса, запросы будут сериализованы на сервере, так что только один будет выполняться одновременно. В отличие от страниц .ASPX, которые поддерживают доступ только для чтения к объекту HttpSessionState, который позволяет одновременно обрабатывать несколько запросов, в веб-службах ASP.NET такой возможности нет. Все вызовы веб-методов с включенными сеансами имеют доступ для чтения/записи и будут сериализованы в каждом сеансе.

Предупреждение: эта статья старая (2002).

Ответ 3

В соответствии с документацией MSDN атрибута WebMethod существует несколько возможных свойств, поэтому я не уверен, что означает истинное значение в вашем атрибуте WebMethod.

Вы пробовали:

[WebMethod(EnableSession=true)]

В соответствии с этот документ, который должен предоставить вам полный доступ к сеансу.