Доброе время суток.
Начал разбираться с wcf. Создал self-hosted сервис. Его конфиг:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfServiceLibrary1.Service1">
<endpoint binding="wsHttpBinding" contract="WcfServiceLibrary1.IService1"
listenUriMode="Explicit">
</endpoint>
<endpoint address="net.tcp://localhost:9092/testing" binding="netTcpBinding"
bindingConfiguration="" contract="WcfServiceLibrary1.IService1" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" listenUriMode="Explicit" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:9094/testing"/>
<add baseAddress="http://localhost:9095/testing"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
</binding>
</netTcpBinding>
<wsHttpBinding>
<binding name="WSHttpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
contract="sr1.IService1" name="WSHttpBinding_IService1" />
<endpoint address="net.tcp://localhost:9090/test" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IService1" contract="sr1.IService1"
name="NetTcpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
В клиенте (WinForms приложение) подключил ServiceModel и добавил ссылку на сервис. Пытаю вызвать метод GetData сервиса и получаю исключение с таким содержанием: "Не удалось обработать сообщение. Скорее всего, причина в том, что действие "
http://tempuri.org/IService1/GetData" является неправильным или сообщение содержит недопустимый или простроченный маркер контекста безопасности, либо имеет место несоответствие между привязками. Маркер контекста безопасности становится недействительным, когда канал прерван службой из-за отсутствия активности. Чтобы предотвратить преждевременное прерывание службой простаивающих сеансов, увеличьте тайм-аут Receive в привязке конечной точки службы."
Метод вызываю так:
ServiceR1.Service1Client client = new ServiceR1.Service1Client("WSHttpBinding_IService1");
label1.Text = client.GetData("asd");
Конфиг клиента:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None"></security>
</binding>
</netTcpBinding>
<wsHttpBinding>
<binding name="WSHttpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:02:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None"></security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:9095/testing" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IService1" contract="ServiceR1.IService1"
name="WSHttpBinding_IService1">
</endpoint>
<endpoint address="net.tcp://localhost:9090/testing" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IService1" contract="ServiceR1.IService1"
name="NetTcpBinding_IService1">
</endpoint>
</client>
</system.serviceModel>
</configuration>
Собственно вопрос: в каком месте я напортачил и как это исправить...
P.S. при проверке в WcfTestClient сервис доступен и нормально отвечает (и по http и по net.tcp)
Здравствуйте, Аноним,
Если честно, не доставляет разбирать нагенерированный мастером код. Напишите конфиг нормально и вдумчиво вручную, я уверен, что после этого все заработает
Здравствуйте, Аноним, Вы писали:
А>Доброе время суток.
Рекомендую скачать вот
этот пак примеров от Microsoft и разобраться в базовых кейсах. Советую, особенно в начале, вообще не пользоваться мастерами типа "Add service reference".
Если мне не изменяет память, то все http привязки требут проверки подключения сертификатом(из хранилища удостоверений), даже если вы указали security mode="None". Это требуется для шифрования сообщений между клиентом и сервисом.
Прочитайте про защиту сообщений при http привязках.
Копать в сторону ServiceHostBase.Credentials.ServiceCertificate.
Здравствуйте, yoriсk.kiev.ua, Вы писали:
YKU>Здравствуйте, Visor2004, Вы писали:
V>>Если честно, не доставляет разбирать нагенерированный мастером код. Напишите конфиг нормально и вдумчиво вручную
YKU>... и вам всенепременно премного "доставит" разбирать метровые простыни XML-a написанные вручную!
такого конфига для начала более чем достаточно. не?
<system.serviceModel>
<client>
<endpoint name="" address="net.tcp://Localhost:7777/Service" binding="netTcpBinding" bindingConfiguration="DebugBinding" contract="IService"/>
</client>
<bindings>
<netTcpBinding>
<binding name="DebugBinding" maxReceivedMessageSize="1073741824">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>