我如何在wcf服务中拥有会话ID

时间:2011-05-25 07:56:03

标签: c# wcf

我正在编写一个具有多种方法的身份验证服务。此方法的一部分是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”。为什么?

3 个答案:

答案 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。 解决方案如下(需要两个步骤):

  1. 在配置文件

    中启用 reliableSession 为true
    <bindings>
      <wsHttpBinding>
        <binding name ="WSHttpBinding_MyService" sendTimeout="00:05:00" >
          <security mode="None"></security>
          <reliableSession enabled="true"/>
        </binding>
      </wsHttpBinding>
    </bindings>
    
  2. 在合约界面中,将 SessionMode 属性设置为必需

    [ServiceContract(SessionMode = SessionMode.Required)]
    public interface IMyService{...}
    
  3. 按照上述步骤,问题将得到解决

答案 2 :(得分:0)

您可以在WCF服务中激活ASP.NET兼容模式,并享受ASP.NET会话和上下文的所有好处。

将此属性添加到WCF类定义中:

[AspNetCompatibilityRequirements(RequirementsMode =
    AspNetCompatibilityRequirementsMode.Required)]

并在你的web.config中:

<configuration>
  <system.serviceModel>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  </system.serviceModel>
</configuration>