Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > WCF сервис, создание клиента


Автор: namespace 6.10.2009, 12:19
коротко об инфраструктуре: ISA сервер с 3-я сетевухами (интернет, ДМЗ, внутренняя) в ДМЗ находится IIS 7
создан WCF сервис, который хостится в WPF приложении вот его конфиг:
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="RS.RSBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="RS.RSBehavior"
                name="RS.RS">
                <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding"
                    contract="RS.IRS">
                    <identity>
                        <dns value="r.t.ru" />
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://r.t.ru:80/" />
                    </baseAddresses>
                </host>
            </service>
        </services>
        <bindings>
            <wsHttpBinding>
                <binding name="wsHttpEndpointBinding">
                    <security mode="None">
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>        
    </system.serviceModel>
    
</configuration>

сам сервис работает во внутренней сети (на ISA для него есть соответствующее правило публикации протокола веб сервера)
есть тестовый консольный клиент вот его конфиг:
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IRS" 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="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">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://r.t.ru/" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_IRS" contract="RSReference.IRS"
                name="WSHttpBinding_IRS">
                <identity>
                    <dns value="r.t.ru" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
    
</configuration>

код его самый простой
Код

...
RSClient client = new RSClient();
client.Open();
RSResult result = client.WriteClient(lastName, firstName, middleName, sD, nD);
Console.WriteLine("\tсообщение: {0}", result.Message);
...


в таком варианте все прекрасно работает. Никак не могу сообразить как сделать веб-клиента для сайта. Сайт ASP.NET расположенный в ДМЗ (работает), кликаю на проекте веб сайта в солюшн эксплорер ПКМ -> Add Web Reference, указываю http://r.t.ru/ добаляю ссылку RSReference
на нужной странице:
Код

protected void Button1_Click(object sender, EventArgs e)
    {
        RSReference.RS client = new RSReference.RS();
        RSReference.RSResult serviceResult = client.WriteClient(TextBoxLastName.Text, TextBoxFirstName.Text, TextBoxMiddleName.Text, TextBoxSD.Text, TextBoxND.Text);
        TextBoxResult.Text = serviceResult.Message;
    }


получаю ошибку: Сбой запроса с состоянием HTTP 407: Proxy Authentication Required
т.е. насколько я понимаю веб клиент запускается на веб сервере ? в ДМЗ (IIS 7) и пытается соеденится с сервисом по http://r.t.ru/ а ISA его посылает ?, я добавил на ISA правило разрешаюшее обращатся из ДМЗ в интернет по адресу http://r.t.ru/, но картина таже, т.е. надо еще этого клиента научить работать через ISA ?
вот конфиг сайта
Код

<?xml version="1.0"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
    <appSettings>
    <add key="RSReference.RS" value="http://r.t.ru/"/>
    </appSettings>
    <connectionStrings/>
    <system.web>
        
        <compilation debug="false">
        </compilation>
        
        <authentication mode="Windows"/>
        
    </system.web>
</configuration>



Автор: mihryak 6.10.2009, 15:24
в клиентском binding'е попробуй изменить useDefaultWebProxy="false" на true

Автор: namespace 6.10.2009, 15:41
в консольном клиенте который работает стоит false т.к. установлен MSFirewall Client он сам все умеет делать (т.е. работают все проги без указания прокси), а вот веб клиенту тоже надо так сделать, а я незнаю куда воткнуть в файл web.config сайта?

Автор: mihryak 6.10.2009, 16:34
невнимательно прочитал
получается, что студия не может создать для себя mex-клиента, чтобы сгенерировать классы для сервиса

попробуй тогда выставить в web.config'е сайта в ноде configuration, по-моему, студия будет использовать конфиг проекта для генерации
Код

<system.net>
  <defaultProxy
    useDefaultCredentials="true" >
  </defaultProxy>
</system.net>


если не поможет, попробуй ещё на самом сервисе настроить специальный binding для mex, у которого будет useDefaultWebProxy="true"

Добавлено через 3 минуты и 14 секунд
http://social.msdn.microsoft.com/forums/en-US/wcf/thread/83bafcd0-5bab-4cb9-96cf-a53ce132c7ab/ твоя проблема обсуждалась

Автор: namespace 6.10.2009, 21:01
чудеса оставил на работе работающий сервис, прихожу домой создаю новый простейший веб сайт Add Service Reference ввожу адрес все Ок, запускаю сайт в студии все работает
а теперь я думаю что дело в том что сайт на работе при создании был указан 2.0 фреймворк, в общем там в контекстном меню в солюшн эксплорере нет пункта Add Service Reference, а есть лишь Add Web Reference и создается какой то другой клиент, т.к. в нем нет например метода .Close()

Автор: namespace 8.10.2009, 13:08
на сегодняшний день имею следующее:
1. консольный клиент запущенный на веб сервере - работает,
2. веб клиент расположеный на этом же компьютере где работает консольный клиент - не работает
3. при работе консольного клиента я в логах ISA вижу всю активность, однако когда работает веб клиент, то от сервера (на котором работает IIS7) нет исходящих запросов на http://r.t.ru/
есть ошибки в логах сервера:

Последовательность событий: 20 
Появление события: 1 
Код подробностей события: 0 
 
Сведения о приложении: 
    Домен приложения: /LM/W3SVC/2/ROOT-1-128994687308225155 
    Уровень доверия: Full 
    Виртуальный путь к приложению: / 
    Путь к приложению: C:\www.t.ru\ 
    Имя компьютера: DUB 
 
Сведения о процессе: 
    Идентификатор процесса: 2928 
    Имя процесса: w3wp.exe 
    Имя учетной записи: NT AUTHORITY\NETWORK SERVICE 
 
Сведения об исключении: 
    Тип исключения: EndpointNotFoundException 
    Сообщение об исключении: Прослушивание на http://r.t.ru/ не выполняла ни одна конечная точка, которая могла бы принять сообщение. Среди прочих причин это могло быть вызвано неправильным адресом или действием SOAP. Подробнее см. в описании InnerException (если имеется). 
 
Сведения о запросе: 
    URL запроса: http://www.t.ru/RS.aspx 
    Путь запроса: /RS.aspx 
    Адрес узла пользователя: 192.168.1.1 
    Пользователь:  
    Проверка подлинности: False 
    Тип проверки подлинности:  
    Имя учетной записи потока: NT AUTHORITY\NETWORK SERVICE 
 
Сведения о потоке: 
    Идентификатор потока: 6 
    Имя учетной записи потока: NT AUTHORITY\NETWORK SERVICE 
    Выполняется олицетворение: False 
    Трассировка стека:    в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   в RSReference.IRS.WriteClient(String lastName, String firstName, String middleName, String seriesDoc, String numberDoc)
   в RSReference.RSClient.WriteClient(String lastName, String firstName, String middleName, String seriesDoc, String numberDoc)
   в RS.ButtonRSWrite_Click(Object sender, EventArgs e)
   в System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   в System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
   в System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

однако адрес http://r.t.ru/  пингуется, открывается стандартная страница о том что служба создана...

я не понимаю как возникает EndpointNotFoundException когда я могу открыть данный юрл или консольный клиент с этой же машины прекрасно работает?
и как IIS7 определяет недоступность конечной точки, когда даже не отправляет запрос на подключение (по логам ISA сервера)?

Автор: namespace 9.10.2009, 13:16
проблема найдена Network Service, а именно от его имени работают пулы приложений IIS7 не имеет доступа к интернету, соответственно когда я для пула ставлю пользователя, например, Администратор, то все работает, но безопасность...
в общем ищу решение...

Автор: namespace 9.10.2009, 21:15
может кто-нибудь уже сталкивался с такой проблемой? что такого противозаконного в соединении с удаленным WCF сервисом, что надо запускать пул от имени Администратора? smile 

Автор: namespace 12.10.2009, 08:23
проблема решена!!! это ISA сервер мозги пудрил, удалил его клиент и в ручную настроил байдинг
...proxyAddress="http://gateway:8080" useDefaultWebProxy="false"...
и все работает от стандартной Network Service

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)