在Web服务调用中只读访问会话?

时间:2009-06-01 16:52:47

标签: asp.net web-services webforms session-state

我们有一个.net asmx Web服务,可以从javascript(使用ASP.Net AJAX)调用,并且需要访问Session。

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

我们遇到了会话被锁定在读/写请求上的问题。有没有办法将Web服务方法标记为要求只读访问Session?

谢谢!

3 个答案:

答案 0 :(得分:7)

这是一个非常古老的主题,但我在寻找同一问题的答案时偶然发现了它。

我在其他地方找到了答案,并将其留在我的地方用于其他互联网:

在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服务始终只具有对会话的只读访问权限,并且不会阻止其他请求

答案 1 :(得分:4)

http://msdn.microsoft.com/en-us/library/aa480509.aspx页面似乎表明答案为“否” - 您无法将Web服务标记为EnableSessionState=ReadOnly

  

如果要从同一进程同时进行Web服务调用,请求将在服务器上序列化,以便一次只能执行一次。与支持对HttpSessionState对象进行只读访问的.ASPX页面(允许同时处理多个请求)不同,ASP.NET Web服务没有这种功能。启用了会话的所有Web方法调用都具有读/写访问权限,并将在每个会话中进行序列化。

警告:那篇文章很旧(2002)。

答案 2 :(得分:0)

根据WebMethod属性的MSDN documentation,有几个可能的属性,所以我不确定WebMethod属性中的'true'值是什么。

你试过了吗?

[WebMethod(EnableSession=true)]

根据this document,可以让您完全访问会话。