Как я могу иметь идентификатор сеанса в сервисе wcf - PullRequest
3 голосов
/ 25 мая 2011

Я кодирую службу аутентификации, которая имеет несколько методов. Одним из методов является ChangePassword. Я хочу, чтобы когда кто-либо захотел изменить пароль, войдите в систему до этого. Для этого я хочу иметь идентификатор сеанса и перед изменением пароля проверьте его.

Как я могу это сделать, и у меня истекло время сеанса?

РЕДАКТИРОВАТЬ 1)

Я пишу этот код, но моя сессия равна нулю каждый раз, когда я хочу получить его значение:

Класс:

[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 ]

6 голосов
/ 25 мая 2011

Чтобы иметь 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 голос
/ 22 апреля 2016

При использовании wsHttpBinding в WCF вы обнаружите, что значение OperationContext.Current.SessionId равно нулю.Решение заключается в следующем (необходимо два шага):

  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{...}
    

Выполните указанные выше шаги, проблема будет решена

0 голосов
/ 25 мая 2011

Вы можете активировать режим совместимости ASP.NET в своей службе WCF и использовать все преимущества сеансов и контекста ASP.NET.

Добавьте этот атрибут в определение класса WCF:

[AspNetCompatibilityRequirements(RequirementsMode =
    AspNetCompatibilityRequirementsMode.Required)]

и в вашем web.config:

<configuration>
  <system.serviceModel>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  </system.serviceModel>
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...