“没有端点侦听”IIS托管WCF服务使用其他Web服务的问题

时间:2018-03-20 14:44:38

标签: wcf iis wcf-endpoint

我创建了一个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文件被添加到引用:

  • CalcService.dll
  • Calculator.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防火墙设置,如本文所述:

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

我希望现在很清楚我们追求的是什么。

1 个答案:

答案 0 :(得分:0)

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