"There was no endpoint listening at" IIS 托管 WCF 服务使用另一个 Web 服务的问题

"There was no endpoint listening at" issue with a IIS Hosted WCF Service consuming another web service

我创建了一个托管在 IIS 中的 WCF 服务,它试图调用另一个 Web 服务(第 3 方)来 return 一些数据。尝试连接服务失败并出现以下错误:

https://xxx(第 3 方 ws)没有端点可以接受消息。这通常是由不正确的地址或 SOAP 操作引起的。有关详细信息,请参阅 InnerException(如果存在)。

此时,我的服务已启动(我从我的 echo 方法知道),如果它是自托管的,它会成功运行。

我已将整个模型和部分复制到 web.config 的模型中,与自托管测试完全一样,但仍然缺少一些东西。

我遇到过其他类似的问题,但我的问题有点具体,因为该服务有点像托管另一个问题,而那个问题导致了这个问题。

我可以尝试用一个真实的例子来更好地解释:

这里有一个简单的 Web 服务:http://www.dneonline.com/calculator.asmx 我想将其包装在我们的库中并通过 IIS 托管的 WCF 提供访问权限。 因此,创建了一个 class 库(Calculator 项目)以使用一种方法,add 以获取两个 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 class 库(CalcService 项目),它使用第一个 class 库来启用 http 端点。同样,app.config 文件包括服务本身和 class 库客户端的端点。 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 项目(Class 库和 WCF 服务)的项目引用,因此两个 dll 文件被添加到引用中:

2-有一个 CalcService.svc 文件,它为 CalcService 创建一个 ServiceHost: <%@ ServiceHost Language="C#" Debug="true" Service="CalcService.Calc"%>

3-有一个 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 class 库项目中的配置文件中的 http://localhost:8733/Design_Time_Addresses/CalcService/Calc/)。 我不知道这里缺少什么,是来自 IIS 配置还是权限? 或者像 windows 防火墙设置这样的东西 post:

请注意,由于我使用的是公司计算机,因此无法关闭防火墙。我可以转on/off一些规则。

我希望现在我们所追求的已经很清楚了。

我们在基于云的机器上测试了该解决方案,它运行良好。最后看起来是一些防火墙规则阻止了 IIS 传出调用,配置文件或代码中没有任何错误。