Создание WCF клиента
От: Аноним  
Дата: 06.10.10 14:25
Оценка:
Доброе время суток.
Начал разбираться с 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)
wcf
Re: Создание WCF клиента
От: Visor2004  
Дата: 06.10.10 14:58
Оценка:
Здравствуйте, Аноним,

Если честно, не доставляет разбирать нагенерированный мастером код. Напишите конфиг нормально и вдумчиво вручную, я уверен, что после этого все заработает
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: Создание WCF клиента
От: Visor2004  
Дата: 06.10.10 15:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброе время суток.


Рекомендую скачать вот этот пак примеров от Microsoft и разобраться в базовых кейсах. Советую, особенно в начале, вообще не пользоваться мастерами типа "Add service reference".
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[2]: Создание WCF клиента
От: yoriсk.kiev.ua  
Дата: 06.10.10 15:37
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Если честно, не доставляет разбирать нагенерированный мастером код. Напишите конфиг нормально и вдумчиво вручную


... и вам всенепременно премного "доставит" разбирать метровые простыни XML-a написанные вручную!
Re: Создание WCF клиента
От: Аноним  
Дата: 07.10.10 05:13
Оценка:
Если мне не изменяет память, то все http привязки требут проверки подключения сертификатом(из хранилища удостоверений), даже если вы указали security mode="None". Это требуется для шифрования сообщений между клиентом и сервисом.
Прочитайте про защиту сообщений при http привязках.
Копать в сторону ServiceHostBase.Credentials.ServiceCertificate.
Re[3]: Создание WCF клиента
От: Visor2004  
Дата: 07.10.10 08:05
Оценка:
Здравствуйте, 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>
Помните!!! ваш говнокод кому-то предстоит разгребать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.