Wcf &引用;无法连接到远程服务器";

Wcf &引用;无法连接到远程服务器";,wcf,wse3.0,Wcf,Wse3.0,我可以从Windows窗体程序调用第三方供应商的web服务。当我尝试从WCF web服务调用相同的web服务和web方法以及相同的URL时,会出现以下错误: ExportValuationPolicyNumber:Exception=System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: A connection attempt fai

我可以从Windows窗体程序调用第三方供应商的web服务。当我尝试从WCF web服务调用相同的web服务和web方法以及相同的URL时,会出现以下错误:

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
我基本上是在尝试为vendor.asmx/WSE3服务编写一个WCF包装器。让我们不要离题——但微软说WCF可以调用WSE3,但只有在打开SSL的情况下,我的供应商——信不信由你——才不允许SSL连接。所以我一直在写包装器,这样我就可以从BizTalk 2009中调用它了。现在,我正在通过一个控制台程序测试包装器

我甚至可以做些什么来调试?我在WCF服务调用.asmx服务之前和之后添加了EventLog跟踪,因此我知道这就是它的所在(加上上面错误中的行号)

我的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>
谢谢

尼尔·沃尔特斯


WireShark分析

我确实运行了Wireshark——在下面的评论中发布了一些结果。然而,在读了更多之后,它并不总是说“无法到达目的地”。但是如果它失败了,我就永远不会得到任何数据。我仍然不知道下一步该怎么办。我一直在比较数据包,但速度很慢,令人困惑。例如,我仍然没有找到我在请求包中传递的密钥(特定的policyNum)。我还看到了一些“无法到达目的地”的语句

在一个有效的,我从来没有看到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
我不确定这证明了什么。正如我所说,我完全可以通过直接调用其WSE3接口从Windows窗体调用相同的Web服务。我知道我可以通过这种方式到达那里

我认为这两个程序的主要区别在于,其中一个是在Win模式下运行,并直接调用WSE3。那一个有效。失败的代码基本上是99%相同的代码,作为WCF服务发布,因此它在IIS下运行(然后控制台程序调用我机器上的WCF/IIS服务,反过来调用WSE3服务)

是否存在IIS不使用同一代理的原因?

可能会在防火墙上禁用Ping请求(ICMP数据包)。因此,完全有可能不返回ping响应,同时能够访问不同端口上的机箱

尝试使用
telnet
连接端口80上的66.77.241.56,查看是否收到响应

telnet 66.77.241.56 80

或者,对所述IP地址的
tracerte
可以为您的网络管理员之一提供一些更详细的信息,因为它可能同样与网络路由或NAT有关


第三种可能性是,您可能需要在
SoapHttpClientProtocol
SOAP客户端实例上显式设置
Proxy
属性。WinForms会自动获取此信息,但从web服务/应用程序中不会出现这种情况。

您可能希望使用它查看网络流量的情况。

也可以查看我对其他人帖子的评论,但另外,与您的诊断日志相关的是,这是我在配置中用于转储WCF跟踪日志的XML:

<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>

感谢以上所有帮助-但这里是真正的答案:

valservice.Proxy=new System.Net.WebProxy(“,true)


在IIS下运行的WCF服务显然没有使用相同的代理,因此我在代码中手动设置了它。我将发布另一个问题,看看是否有办法在配置文件中实现这一点

当我直接运行到WSE3的表单时,它是有效的。当我运行控制台程序到WCF包装器时,它会失败,出现“目标不可访问”和“通信管理过滤器”,显然是由代理造成的。但是代理如何知道两者之间的区别呢?如果你能像@Wim建议的那样通过telnet连接,那么我会为“旧”WinForms应用程序和你的WCF应用程序运行Wireshark会话,并比较数据包的内容。客户端可能正在连接,但服务器可能未提供响应。可能数据结构略有不同,服务器无法处理请求。谢谢,但错误来自调用非WCF.asmx WSE3 web服务的WCF程序。它是WSE服务的WCF包装器。请参阅我原始问题底部的结果。不确定这证明了什么。(必须在Win 2008服务器上启用Telnet功能-或者早一点就会这样做)。是的,根据我在回答中的第三个选项。;-)您也可以在web.config
<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>