在 .NET ASMX Web 服务中获取会话
Posted
技术标签:
【中文标题】在 .NET ASMX Web 服务中获取会话【英文标题】:Getting session in .NET ASMX web-service 【发布时间】:2011-03-18 21:05:57 【问题描述】:我在我的 ASP.NET Web 应用程序旁边托管了一个 ASMX Web 服务。现在,我需要让用户会话进入 Web 服务。为了测试这一点,我做了这个简单的方法:
[WebMethod(EnableSession = true)]
public string checkSession()
return HttpContext.Current.Session["userid"].ToString();
所以,首先我登录到我的网络应用程序,然后在浏览器中转到我的网络服务并单击自动生成的测试页面上的“checkSession”。我已经在 3 台计算机上对此进行了测试。所有 3 个都可以在 webapp 上正常工作(因此正在创建会话等),其中 2 个在调用 webmethod 时返回 Session["userid"] 的值,但是最后一台计算机返回“对象引用未设置为对象的实例”,因为 Session 为空。
那么,这些计算机之间有什么区别?为什么我的 ASP.NET 应用程序可以在所有计算机上获取会话,但 web 服务不能?
【问题讨论】:
你是如何存储你的会话的?如果在进程内,您需要 asmx webservice 在与 webapp 相同的 appPool 上运行。您是否一直收到那台机器的会话错误? 我其实不知道。我所做的就是当他们最初在 ASP.NET 端登录时,我设置: Session["userid"] = theiridfromdb;首先,我如何检查它是否在进程中,然后我将如何在同一个 appPool 中运行 web 服务?是的,那台电脑总是报错。 看起来 inproc 是默认值,所以是的,我正在使用它。我在运行 IIS6 的专用服务器上运行它,ASP.NET 站点和 web 服务是一个应用程序。同样,它们是 IIS 中的同一个应用程序,Visual Studio 将它们的后端编译为同一个 DLL。 查看这篇文章:启用会话的网络服务 - devhood.com/messages/message_view-2.aspx?thread_id=50261 在不同的注释 - 你不应该在一个可能为 null 的对象上调用 ToString() - 应该首先检查 null。 【参考方案1】:也许为时已晚,但你有没有试过这个:
[WebMethod(EnableSession = true)]
public string checkSession()
return HttpContext.Current.Session.SessionID
【讨论】:
这正是我需要知道的,它解决了我的空会话问题。我只是将 [WebMethod(EnableSession = true)] 放在我的方法上,该方法返回其他数据。谢谢!【参考方案2】:默认情况下,SessionID 在客户端浏览器上存储为 cookie (Session State Overview)。因此,请检查该 cookie 是否在该问题计算机上正确创建。也许cookie由于某种原因被禁用?在这种情况下,当您访问该 Web 服务时,它不会将 SessionID 发送到服务器。
【讨论】:
【参考方案3】:您能检查一下您的应用程序使用了多少个工作进程吗?您可以在 IIS 的应用程序池设置中检查它。
如果使用了多个工作进程,则调用它来运行网络花园。如果是这种情况,那么在 proc 会话中将没有用,因为 此会话不会在工作进程之间共享。看看http://www.west-wind.com/weblog/posts/2005/Apr/20/Why-you-shouldnt-use-InProc-Session-State-in-ASPNET
【讨论】:
【参考方案4】:您是否在 IIS 中禁用了 Session,这将超过规则 .net。
看看这个http://technet.microsoft.com/en-us/library/cc732964(v=ws.10).aspx - 它告诉你如何禁用会话,但显示在哪里检查设置。
谢谢 弗兰
【讨论】:
【参考方案5】:默认情况下,Web 服务是并且应该是无状态的。但是,如果您必须使用会话信息,请务必使用标记接口 IReadOnlySessionState 和 IRequiresSessionState 以便访问、使用或修改 Web 服务中的会话状态信息。
【讨论】:
【参考方案6】:Web 服务默认不支持 Session。您需要在 web 方法属性中显式指定参数
这两件事对我有用
<add name="Session"
type="System.Web.SessionState.SessionStateModule"/>
下
<httpModules>
enableSessionState="true"
在<page>
标签中
【讨论】:
这是 1 AND 2,还是 1 OR 2? 1 和 2 ;执行第一步,然后在页面中启用 sessionState(步骤 2)【参考方案7】:会话对象可通过以下方式访问:
var session = this.Session;
var contextSession = this.Context.Session;
【讨论】:
【参考方案8】:在您的会话不为空之前执行此方法检查的最佳方法,而在另一边您 使用您的值初始化所选会话,然后使用 httpcontext.current.session 的 Web 服务何时何地具有价值!
Web 服务是无状态的,最好的方法是在 Web 服务中获取值,而不是设置或初始化会话值
【讨论】:
以上是关于在 .NET ASMX Web 服务中获取会话的主要内容,如果未能解决你的问题,请参考以下文章
如何使用jQuery调用带有参数的asp.net asmx web服务来获取响应
如何使用 Retrofit 在 android 中调用图像上传 Web 服务 (ASP.NET) .asmx 文件
无法从 .net 中的 Ajax 调用 .asmx Web 服务
从 Web 服务 (asmx) 页面引用 asp.net 页面上的字段