这是我的wcf应用程序的界面和类。首先,我希望通过
获取我的方法中的sessionId string sessionId=OperationContext.Current.SessionId
但是我发现sessionId总是为null。所以我尝试使用并成功保存asp.net会话,如
HttpContext.Current.Session.Add("testSession", "testSession");
在一个方法中。在其他方法中,我尝试获取testSession
,但它为空。
var myTestSession= HttpContext.Current.Session["testSession"];
我的代码有什么问题?为什么SessionId总是为空?
我的wcf界面
[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface ITestSession
{
[OperationContract]
string SetSession(string sessionvalue);
[OperationContract]
string GetSession();
}
我的wcf课程
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
//[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class TestSession: ITestSession
{
public string SetSession(string sessionvalue)
{
HttpContext.Current.Session.Add("testSession", sessionvalue);
return sessionvalue;
}
public string GetSession(string sessionvalue)
{
var testValue = HttpContext.Current.Session["testSession"];
if (testValue ==null)
return "null value";
else
return testValue;
}
}
}
我尝试添加或删除<!--aspNetCompatibilityEnabled="true"-->
之类的配置,但仍然获得空会话。如何解决?
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
</system.serviceModel>
答案 0 :(得分:1)
WCF sessions are not at all like HTTP sessions.明确打开和关闭它们。 HttpContext
根本不适用,因为WCF不一定是基于HTTP的。
答案 1 :(得分:0)
1)管理WCF中的会话,想想管理服务的InstanceContextMode,看看这个post
2)如果我理解你有一个方法调用会在开始你的会话之前授权调用其他方法,如果这是你的需要,你可以使用IsTerminating和IsInitiating方法attributs,如下所述:
http://www.remondo.net/managing-wcf-session-lifetime-isinitiating-isterminating/