У меня проблемы с [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?Что я неправильно настроил?