Почему WCF InstanceContextMode.PerSession не работает через https? - PullRequest
1 голос
/ 09 декабря 2010

У меня проблемы с [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]

У меня есть простая служба wcf, которая размещена в IIS 7.

Код службы:

[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface IService1
{
    [OperationContract]
    int SetMyValue(int val);

    [OperationContract]
    int GetMyValue();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession )]
public class Service1 : IService1
{
    int MyValue = 0;

    public int SetMyValue(int val)
    {
        MyValue = val;
        return MyValue;
    }

    public int GetMyValue()
    {
        return MyValue;
    }

}

Все работает, если сайт службы использует http.Например, [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)] результат для клиента:

Service1Client client = new Service1Client ();
client.GetMyValue ();// ==> возвращает 0
client.SetMyValue (1);// ==> возвращает 1
client.GetMyValue ();// ==> возвращает 1
client.SetMyValue (6);// ==> возвращает 6
client.GetMyValue ();// ==> возвращает 6

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)] результат для клиента:

Service1Client client = new Service1Client ();
client.GetMyValue ();// ==> возвращает 0
client.SetMyValue (1);// ==> возвращает 1
client.GetMyValue ();// ==> возвращает 0
client.SetMyValue (6);// ==> возвращает 6
client.GetMyValue ();// ==> возвращает 0

Теперь, когда я настраиваю свою службу на использование https и безопасность транспорта с сертификатом, InstanceContextMode.PerSession действует как InstanceContextMode.PerCall.

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)] результат для клиента теперь изменен:

Service1Client client = новый Service1Client ();
client.ClientCredentials.ClientCertificate.SetCertificate.SetCertificate.SetCertificateate.SetCertificateate .SetCertificateate.SetCertificateate .SetCertificateate.SetCertificateate.SetCertificateate .SetCertificateate.SetCertificateate.CurrentUser, StoreName.My, X509FindType.FindByThumbprint, "3d6ca7a6ebb8a8977c958a3d8e4436337b273e4e");
client.GetMyValue ();// ==> возвращает 0
client.SetMyValue (1);// ==> возвращает 1
client.GetMyValue ();// ==> возвращает 0
client.SetMyValue (6);// ==> возвращает 6
client.GetMyValue ();// ==> возвращает 0

Мой сервис web.config:

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpEndpointBinding">
      <security mode="Transport">
        <transport clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<services>
  <service behaviorConfiguration="ServiceBehavior" name="WcfServiceLibrary1.Service1">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding"
      name="wsHttpEndpoint" contract="WcfServiceLibrary1.IService1" />
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>   

Почему PerSession действует как PerCall?Что я неправильно настроил?

1 Ответ

2 голосов
/ 10 декабря 2010

Я получил поддержку сеанса, работающую по HTTPS.

WSHttpBinding не поддерживает надежные сеансы по транспортной безопасности (HTTPS).

Вместо использования wsHttpBinding я создал пользовательскую привязку:

<customBinding>
  <binding configurationName="customReliableHttpBinding">
    <reliableSession />
    <textMessageEncoding/>
    <httpsTransport authenticationScheme="Anonymous" requireClientCertificate="true"/>
  </binding>
</customBinding>
...