我正在编写一个具有多种方法的身份验证服务。此方法的一部分是ChangePassword。我希望当任何机构想要更改密码时,请先登录系统。为此我想要一个会话ID并在更改传递之前检查它。
我怎么能这样做并且会议时间过去了?
编辑1)
我编写了这段代码但是每次我想要得到它的值时我的会话都是null:
类别:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class Service2 : IService2
{
string result
{ // Store result in AspNet session.
get
{
if (HttpContext.Current.Session["Result"] != null)
return HttpContext.Current.Session["Result"].ToString();
return "Session Is Null";
}
set
{
HttpContext.Current.Session["Result"] = value;
}
}
public void SetSession(string Val)
{
result = Val;
}
public string GetSession()
{
return result;
}
接口:
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IService2
{
[OperationContract]
void SetSession(string Val);
[OperationContract]
string GetSession();
}
的web.config
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
编辑2) 我写了这段代码,但它不起作用:
private void button1_Click(object sender, EventArgs e)
{
MyService2.Service2Client srv = new MyService2.Service2Client();
textBox1.Text = srv.GetSession();
}
private void button2_Click(object sender, EventArgs e)
{
MyService2.Service2Client srv = new MyService2.Service2Client();
srv.SetSession(textBox1.Text);
textBox1.Clear();
}
每次我想获得Session值时,我都会得到“Session Is Null”。为什么?
答案 0 :(得分:6)
为了拥有SessionId,您必须具有启用会话的绑定。例如,wsHttpBinding
。在您的配置文件中,您应该具有以下内容:
<services>
<service name="MyService">
<endpoint address="" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_MyServiceConfig"
contract="IMyService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</service>
</services>
在IMyService
界面中,您必须将SessionMode
属性设置为Required
,如下所示:
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMyService
{
[OperationContract]
AuthenticationData Authenticate(string username, string password);
}
设置完所有内容后,您可以按照以下方式转到SessionId
:
var sessionId = OperationContext.Current.SessionId;
另一种方法是启用AspNetCompatibilityRequirements但是获得SessionId有点过分。
答案 1 :(得分:1)
在WCF中使用wsHttpBinding时,您会发现OperationContext.Current.SessionId的值为null。 解决方案如下(需要两个步骤):
在配置文件
中启用 reliableSession 为true<bindings>
<wsHttpBinding>
<binding name ="WSHttpBinding_MyService" sendTimeout="00:05:00" >
<security mode="None"></security>
<reliableSession enabled="true"/>
</binding>
</wsHttpBinding>
</bindings>
在合约界面中,将 SessionMode 属性设置为必需
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMyService{...}
按照上述步骤,问题将得到解决
答案 2 :(得分:0)
您可以在WCF服务中激活ASP.NET兼容模式,并享受ASP.NET会话和上下文的所有好处。
将此属性添加到WCF类定义中:
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Required)]
并在你的web.config中:
<configuration>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
</configuration>