【问题标题】:"There was no endpoint listening at" issue with a IIS Hosted WCF Service consuming another web service使用另一个 Web 服务的 IIS 托管 WCF 服务出现“没有端点监听”问题
【发布时间】:2018-03-20 14:44:38
【问题描述】:

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

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

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

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

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

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

这里有一个简单的 Web 服务:http://www.dneonline.com/calculator.asmx,我想将它封装在我们的库中,并通过 IIS 托管的 WCF 提供访问权限。 因此,创建了一个类库(计算器项目)以使用一个方法,添加以获取两个 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: &lt;%@ ServiceHost Language="C#" Debug="true" Service="CalcService.Calc"%&gt;

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>

现在,当使用一个简单的客户端进行测试以调用计算器的 add 方法时,它会失败并出现以下错误:

http://www.dneonline.com/calculator.asmx 上没有可以接受消息的端点侦听。这通常是由不正确的地址或 SOAP 操作引起的。有关详细信息,请参阅 InnerException(如果存在)。

我不知道端点期待的是哪条消息,我只能假设它必须是 Service.CalculatorSoap,因为它以前在控制台应用程序中工作过。 另一方面,让我感到困惑的是,自托管 WCF 也可以工作(通过 WCF 类库项目中的配置文件中的 http://localhost:8733/Design_Time_Addresses/CalcService/Calc/)。 我不知道这里缺少什么,是来自 IIS 配置还是权限? 或者像这篇文章中解释的 Windows 防火墙设置:

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

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

【问题讨论】:

  • 它应该“正常工作”。这里的信息太少,无法说明为什么没有。
  • 你从“没有端点监听,第 3 方 ws”到“我的服务启动”,但这不是问题。你能读懂第 3 方吗,它是如何托管的,等等。
  • 好的,我现在用一个例子更新了这个问题。希望它看起来更好。
  • 您有一个可以工作的控制台应用程序和一个不清楚的(对我来说)Web 服务,而同一个调用却没有。安装 Fiddler 并仔细比较这 2 个调用中发生的情况。
  • 感谢@HenkHolterman 提供 Fiddler 的提示。我用wireshark尝试了同样的方法,但由于调用没有通过,我猜是我们的防火墙阻止了一些端口。

标签: wcf iis wcf-endpoint


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2011-02-13
    相关资源
    最近更新 更多