2011-09-25 205 views
11

这是我发起会话ASP.NET + C#HttpContext.Current.Session为空(里面的WebService)

protected void Session_Start(object sender, EventArgs e) 
    { 
     HttpContext.Current.Session["CustomSessionId"] = Guid.NewGuid(); 
    } 

在我的下一个类库解决方案,我很triyng进行访问和获取零例外:

string sess = HttpContext.Current.Session["CustomSessionId"] ; 

这是我在web.config中和的app.config配置(在我的库)

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 
    <system.web> 
     <pages enableSessionState = "true" /> 
     <httpModules> 
     <add type="System.Web.SessionState.SessionStateModule" name="Session"/> 
     </httpModules> 
     <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 

(的app.config)

+0

执行HTTP请求的哪个阶段是你调用你的类库中的方法试图访问会话? –

+0

很难说,但我认为这不是你的会议是空的,但HttpContext.Current - 和顺便说一句:你知道你试图将一个Guid转换为一个字符串,即使这有效吗? – Carsten

+0

其实它是在一个web服务,我没有提到(虐待编辑我的帖子) – SexyMF

回答

28

根据你的意见,你似乎试图访问Web服务中的会话。 Web服务是无状态的,他们应该是这样。如果要违背这个规律,让他们级状态,你可以启用这样一个经典的ASMX Web服务会话:

[WebMethod(EnableSession = true)] 
public void SomeMethod() 
{ 
    ... invoke the method in your class library that uses Session 
} 

这就是说,在类库使用HttpContext.Current是应该回避的非常做法所有的价格。

+0

直到我可以打勾为你的“V”,你能解释为什么它不被推荐这么做吗?谢谢 – SexyMF

+1

@putin,原因很多。例如HttpContext.Current是一个静态方法,它只能在Web上下文中使用。这意味着如果他们依赖它,你将永远无法单独测试你的类库函数。另一个缺点是您正在将您的类库耦合到ASP.NET环境中,并且类库是可重用的组件。就Session部分而言,会话默认存储在Web服务器的内存中。因此,例如,如果您在Web场中运行,则会话必须分发... –

+0

...跨该Web场的所有节点或在node1上创建其会话时创建的客户端在节点2上找不到它。由于这个原因,会话使Web应用程序变为有状态并且更难以扩展。不惜一切代价避免它们。 HTTP世界中有很多其他技术可以让你实现无状态的应用程序,你应该从中受益。 –

相关问题