"Невозможно подключиться к удаленному серверу"
Вопрос
Я могу нормально вызвать веб-службу стороннего поставщика из программы форм Windows.Когда я пытаюсь вызвать ту же веб-службу и веб-метод и тот же URL-адрес из веб-службы WCF, я получаю следующую ошибку:
ExportValuationPolicyNumber:Exception=System.Net.WebException: Unable to connect to the remote server --->
System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly
respond after a period of time, or established connection failed
because connected host has failed to respond 66.77.241.76:80
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.GetRequestStream()
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at TFBIC.RCT.WCFWebServices.ExpressLync.ValuationServiceWse.ExportValuationPolicyNumber(String PolicyNumber) in c:\Source\TFBIC.RCT.WCFWebServices\TFBIC.RCT.WCFWebServices\Web References\ExpressLync\Reference.cs:line 519
at TFBIC.RCT.WCFWebServices.ValuationService.ExportValuationPolicyNumber(String PolicyNumber) in c:\Source\TFBIC.RCT.WCFWebServices\TFBIC.RCT.WCFWebServices\ValuationService.svc.cs:line 97
По сути, я пытаюсь написать оболочку WCF для службы поставщика .asmx/WSE3.Не будем отклоняться от темы — Microsoft утверждает, что WCF может вызывать WSE3, но только с включенным SSL, а мой поставщик — хотите верьте, хотите нет — не разрешает SSL-соединение.Итак, я застрял в написании оболочки, чтобы иметь возможность звонить из BizTalk 2009.Прямо сейчас тестирую обертку через консольную программу.
Что я могу сделать для отладки?Я добавил трассировки EventLog до и после службы WCF, где она вызывает службу .asmx, поэтому я знаю, где она сгорает (плюс номер строки в ошибке выше).
У меня в web.config есть следующее:
<microsoft.web.services3>
<diagnostics>
<trace enabled="true"
input="c:\inetpub\wwwroot\wsetraces\InputTrace.webinfo"
output="c:\inetpub\wwwroot\wsetraces\OutputTrace.webinfo" />
<detailedErrors enabled="true" />
</diagnostics>
</microsoft.web.services3>
и я предоставил всем полный доступ к каталогу - но никаких следов там не появляется.
Что я могу найти или попробовать, чтобы отладить это?
Теоретически результаты «пинга» не должны иметь значения, потому что веб-сайт работает из программы формы Windows, которая нормально его вызывает.
Тем не менее - вот что показывает Ping и мне это кажется немного сомнительным:
C:\Users\uxnxw01>ping rct.msbexpress.net
Pinging rct.msbexpress.net [66.77.241.56] with 32 bytes of data:
Reply from 10.193.99.5: Destination net unreachable.
Reply from 10.193.99.5: Destination net unreachable.
Request timed out.
Reply from 10.193.99.5: Destination net unreachable.
Ping statistics for 66.77.241.56:
Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
Спасибо,
Нил Уолтерс
Анализ WireShark
Я запустил Wireshark - опубликовал некоторые результаты в комментариях ниже.Однако, прочитав его дальше, там не всегда написано «Пункт назначения недостижим».Но в случае сбоя я никогда не получаю никаких данных.Я все еще в замешательстве, что делать дальше.Я сравнивал пакеты, но это медленно и запутанно.Например, я до сих пор не нашел ключ (определенный номер политики), который передаю в пакете запроса.Я также вижу несколько утверждений «Пункт назначения недоступен» в том, который сработал.
В том, что работает, я никогда не вижу 66.77.241.76, вижу только прокси нашей компании.Но я не вижу в конфигурации (или коде) ничего, что могло бы указать WSE3 использовать или не использовать прокси.
Результаты Telnet:
C:\Users\uxnxw01>telnet 66.77.241.56 80
Connecting To 66.77.241.56...Could not open connection to the host, on port 80:
Connect failed
C:\Users\uxnxw01>telnet 66.77.241.76 80
Connecting To 66.77.241.76...Could not open connection to the host, on port 80:
Connect failed
Я не уверен, что это доказывает.Как я уже сказал, я определенно МОГУ вызвать тот же веб-сервис из формы Windows, напрямую вызывая его интерфейс WSE3.Я знаю, что смогу туда добраться.
Я думаю, что основные различия между этими двумя программами заключаются в том, что одна из них работает в форме Win и напрямую вызывает WSE3.Это работает.Тот, который дает сбой, по сути, на 99% тот же код, опубликованный как служба WCF, поэтому он работает под IIS (затем консольная программа вызывает службу WCF/IIS на моем компьютере, которая, в свою очередь, вызывает службу WSE3).
Есть ли какая-то причина, по которой IIS не будет использовать тот же прокси?
Решение
Спасибо всей помощи выше, но вот реальный ответ:
valservice.Proxy = новый System.Net.WebProxy("http://10.192.xx.xx:8080", истинный);
Служба WCF, работающая под IIS, очевидно, НЕ использовала тот же прокси-сервер, поэтому я установил его вручную в коде.Я опубликую еще один вопрос, чтобы узнать, есть ли способ сделать это в файле конфигурации.
Другие советы
Вы можете использовать Вайршарк чтобы увидеть, что происходит с сетевым трафиком.
Запросы Ping (пакеты ICMP) могут быть отключены на брандмауэре.Таким образом, вполне возможно не получить ответ на ping, но при этом иметь доступ к устройству через разные порты.
Попробуйте и используйте telnet
подключиться к 66.77.241.56 через порт 80 и посмотреть, получите ли вы ответ.
telnet 66.77.241.56 80
Альтернативно, tracerte
указанный IP-адрес может предоставить более подробную информацию одному из ваших сетевых администраторов, поскольку это в равной степени может быть связано с сетевой маршрутизацией или NAT.
Третья возможность заключается в том, что вам может потребоваться явно установить Proxy
недвижимость на вашем SoapHttpClientProtocol
Экземпляр клиента SOAP.WinForms распознает это автоматически, но в веб-сервисе/приложении это не так.
См. также мои комментарии к сообщениям других людей, но, кроме того, что касается вашего журнала диагностики, это XML, который у меня есть в моей конфигурации для создания дампа журнала трассировки WCF:
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
<listeners>
<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "MyService.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>