我创建了一个WCF服务,该服务托管在IIS中,并尝试调用另一个Web服务(第三方)来返回一些数据。尝试连接服务失败时出现以下错误:
在https://xxx(第三方ws)没有可以接受该消息的端点。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。
而这一段时间,我的服务已经启动(我从我的echo方法中知道)并且如果它是自托管的,它会成功运行。
我将整个和部分复制到web.config的模型,就像自托管测试一样,但仍然缺少某些内容。
我已经遇到了其他类似的问题报告,但我的一点点具体,因为该服务有点托管另一个,而且这个问题导致了这个问题。
我可以尝试用一个真实的例子来更好地表达:
这里有一个简单的Web服务:http://www.dneonline.com/calculator.asmx我想在我们的库中包装并通过IIS托管的WCF提供访问权限。 因此,使用一个方法创建一个类库(Calculator项目),添加两个int参数并使用它们来调用Web服务添加方法。 web服务在库中被引用为服务引用,并在配置库app.config文件中进行内部寻址,如下所示:
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="CalculatorSoap" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://www.dneonline.com/calculator.asmx"
binding="basicHttpBinding" bindingConfiguration="CalculatorSoap"
contract="Service.CalculatorSoap" name="CalculatorSoap" />
</client>
</system.serviceModel>
</configuration>
然后有一个WCF类库(CalcService项目),它使用第一个类库来启用http端点。同样,app.config文件既包括服务本身的端点,也包括类库的客户端。 app.config文件看起来几乎是这样的:
<configuration>
<system.serviceModel>
<services>
<service name="CalcService.Calc">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8733/Design_Time_Addresses/CalcService/Calc/" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<endpoint address="" binding="basicHttpBinding" contract="CalcService.ICalc">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<!-- Client endpoint, i.e. to be able to use the calculator.asmx service addressed in the class library -->
<client>
<endpoint address="http://www.dneonline.com/calculator.asmx"
binding="basicHttpBinding"
contract="Service.CalculatorSoap" name="CalculatorSoap" />
</client>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
我能够通过控制台应用程序测试整个事情,该应用程序调用WCF服务并收到答案。控制台应用程序配置文件只有一个到WCF的客户端端点,如下所示:
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://localhost:8733/Design_Time_Addresses/CalcService/Calc/"
binding="basicHttpBinding" contract="Calculator.ICalc" name="BasicHttpBinding_ICalc" />
</client>
</system.serviceModel>
</configuration>
我现在的问题是如何在IIS中托管WCF服务?我尝试了不同的方法,但都没有工作。我当前的IIS项目(不起作用)如下所示: 1 - 具有对prevoius项目(类库和WCF服务)的项目引用,因此两个dll文件被添加到引用:
2 - 有一个CalcService.svc文件,它为CalcService创建一个ServiceHost:
<%@ ServiceHost Language="C#" Debug="true" Service="CalcService.Calc"%>
3 - 有一个带有cliend端点的web.config到calculator.asmx:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="CalculatorSoap" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://www.dneonline.com/calculator.asmx"
binding="basicHttpBinding" bindingConfiguration="CalculatorSoap"
contract="Service.CalculatorSoap" name="CalculatorSoap" />
</client>
<!-- some other settings -->
</system.serviceModel>
现在,当使用简单的客户端进行测试以调用计算器添加方法时,它会失败并出现以下错误:
http://www.dneonline.com/calculator.asmx没有可以接受该消息的端点。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。
我不知道端点期望哪条消息,我可以假设它必须是Service.CalculatorSoap,因为它之前从控制台应用程序工作。 另一方面,令我困惑的是,自托管WCF也可以在WCF类库项目的配置文件中通过 http://localhost:8733/Design_Time_Addresses/CalcService/Calc/ 工作。 我不知道这里缺少什么,是IIS配置还是权限? 或者其他一些像Windows防火墙设置,如本文所述:
请注意,由于我使用的是公司计算机,因此我无法关闭防火墙。我可以打开/关闭一些规则。
我希望现在很清楚我们追求的是什么。
答案 0 :(得分:0)
我们在基于云的计算机上测试了该解决方案并且运行良好。最后,它看起来是阻止IIS传出调用的一些防火墙规则,配置文件或代码中没有任何错误。