开发者

How I can have a session id in wcf Service

开发者 https://www.devze.com 2023-03-08 17:02 出处:网络
I\'m coding an authentication service that have multiple methods.one of this method is ChangePassword. I want when any body wants to change the password, logon to system before.for this I want to have

I'm coding an authentication service that have multiple methods.one of this method is ChangePassword. I want when any body wants to change the password, logon to system before.for this I want to have a 开发者_StackOverflow社区session id and before changing pass check it.

How I can do that and has this session time out?

EDIT 1)

I write this code but my session is null every time I want get it's value:

Class:

[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;
    }

interface:

[ServiceContract(SessionMode = SessionMode.Required)]
public interface IService2
{
    [OperationContract]
    void SetSession(string Val);

    [OperationContract]
    string GetSession();
}

web.config

  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />

EDIT 2) I wrote this code but it don't work:

 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();
    }

every time I want to get Session value I get "Session Is Null" .Why?


In order to have SessionId, you have to have Session-enabled binding. For example, wsHttpBinding. In your config file, you should have something like:

  <services>
  <service name="MyService">
    <endpoint address="" binding="wsHttpBinding"
    bindingConfiguration="WSHttpBinding_MyServiceConfig"
    contract="IMyService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
  </service>
  </services>

In the IMyService interface, you have to have SessionMode attribute set to Required, like so:

[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMyService
{
    [OperationContract]
    AuthenticationData Authenticate(string username, string password);
}

When all of this is setup, you can get to the SessionId like this:

var sessionId = OperationContext.Current.SessionId;

Another way would be to enable AspNetCompatibilityRequirements but it's a bit of an overkill just to get the SessionId.


When use wsHttpBinding in WCF you will find the value of OperationContext.Current.SessionId is null. The Solution is as follows(need two steps):

  1. Enable reliableSession to true in the configuration file

    <bindings>
      <wsHttpBinding>
        <binding name ="WSHttpBinding_MyService" sendTimeout="00:05:00" >
          <security mode="None"></security>
          <reliableSession enabled="true"/>
        </binding>
      </wsHttpBinding>
    </bindings>
    
  2. In the contract interface, have SessionMode attribute set to Required

    [ServiceContract(SessionMode = SessionMode.Required)]
    public interface IMyService{...}
    

Follow the steps above, the problem will be solved


You can activate the ASP.NET compatibility mode in your WCF service, and have all the benefits of ASP.NET sessions and context.

Add this attribute to your WCF class definition:

[AspNetCompatibilityRequirements(RequirementsMode =
    AspNetCompatibilityRequirementsMode.Required)]

and in your web.config:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号