[英]No endpoint listening error when trying to connect to a WCF service with named pipe endpoint from Web application hosted in IIS
[英]“There was no endpoint listening at” issue with a IIS Hosted WCF Service consuming another web service
我创建了一个WCF服务,该服务托管在IIS中,并试图调用另一个Web服务(第三方)以返回一些数据。 尝试连接服务时失败,并显示以下错误:
没有在https:// xxx (第三方ws)上监听的端点可以接受该消息。 这通常是由不正确的地址或SOAP操作引起的。 有关更多详细信息,请参见InnerException(如果存在)。
这是我的服务启动了(我从echo方法知道),并且如果它是自托管的,则可以成功运行。
我将整个和部分复制到web.config模型中,就像用于自托管测试一样,但是仍然缺少一些东西。
我曾报道过其他类似的问题,但是我的问题有点具体,因为该服务有点像托管另一项服务,而那是导致此问题的原因。
我可以尝试用一个真实的例子更好地解释一下:
这里有一个简单的Web服务: http : //www.dneonline.com/calculator.asmx ,我想将其包装在我们的库中并通过IIS托管的WCF提供访问。 因此,使用一个方法创建了一个类库(Calculator项目),添加了两个int参数,然后使用它们调用Web服务的add方法。 该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>
现在,当使用简单的客户端进行测试以调用计算器的add方法时,它将失败,并显示以下错误:
在http://www.dneonline.com/calculator.asmx上没有侦听终结点的端点可以接受该消息。 这通常是由不正确的地址或SOAP操作引起的。 有关更多详细信息,请参见InnerException(如果存在)。
我不知道端点期望什么消息,我只能假设它必须是Service.CalculatorSoap,因为它以前在控制台应用程序中可以正常工作。 另一方面,让我感到困惑的是,自托管的WCF也可以工作(通过WCF类库项目中的配置文件中的http:// localhost:8733 / Design_Time_Addresses / CalcService / Calc / )。 我不知道这里缺少什么,是来自IIS配置或权限的东西吗? 或其他类似Windows防火墙设置的内容,如本文所述:
请注意,由于我使用的是公司计算机,因此无法关闭防火墙。 我可以打开/关闭一些规则。
我希望现在清楚我们要做什么。
我们在基于云的计算机上测试了该解决方案,并且运行良好。 最后,它似乎是一些防火墙规则阻止了IIS的传出调用,并且配置文件或代码中没有错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.