繁体   English   中英

IIS托管WCF服务使用另一个Web服务时出现“没有端点侦听”问题

[英]“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文件添加到引用中:

  • CalcService.dll
  • 计算器.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM