WCF中的多个端点问题疑难解答

时间:2010-05-02 15:52:44

标签: .net wcf

我已经使用WCF几年了,并且相当熟悉它,但是有一个简单的WCF概念,我还没有使用它并且遇到了困难。

关于WCF寻址的this文章,因为它与IIS中的多个端点有关,我看到以下两个摘录:

“假设您有一个名为calc.svc的文件,并将其放在与(http://localhost:8080/calcservice)对应的虚拟目录中。此服务的基地址为(http://localhost:8080/calcservice/calc.svc) 。“

“现在,考虑在虚拟目录的web.config文件中找到的端点配置(如图3所示)。在这种情况下,第一个端点的地址与基址相同({{3}因为我把端点地址留空了。第二个端点的地址变成了附加“安全”的基地址的组合,如下所示:(http://localhost:8080/calcservice/calc.svc)。“

现在在我的应用程序中,我正在尝试为同一服务创建两个端点(如下所示)。服务名称是MainService.svc。对于端点1,我有地址=“”,端点2有地址=“Soap11”。在IIS中引入站点我可以成功点击此URL:(http://localhost:8080/calcservice/calc.svc/secure)。根据我能找到的所有文档,这是服务的基地址。根据这篇文章和其他人我已经看到确认其信息我应该在(https://localhost:444/MainService.svc)有第二个端点但是如果我导航到该URL我得到.Net异常,表明找不到资源。

我是否可以使用查看的工具,我的不同端点可用?也许我可以打开一些IIS或aspnet_isapi.dll日志?我的web.config部分定义了我的端点。

提前感谢您的帮助

<service behaviorConfiguration="MyService.MainServiceBehavior" name="MyService.MainService">
  <endpoint address="" binding="wsHttpBinding" bindingConfiguration="WSBindingConfig" contract="MyService.IMainService">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
  <endpoint address="Soap11" binding="basicHttpBinding" bindingConfiguration="BasicBindingWithCredentials"
            contract="MyService.IMainService">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>

进一步观察我看到WSDL确实引用了这两个端点,并且在我希望找到它们的地方。然而,我仍然难以使用它们。这就是服务的内容:

<wsdl:service name="MainService">
    <wsdl:port name="WSHttpBinding_IMainService" binding="tns:WSHttpBinding_IMainService">
        <soap12:address location="https://localhost/MainService.svc/Soap12" /> 
        <wsa10:EndpointReference>
            <wsa10:Address>https://localhost/MainService.svc/Soap12</wsa10:Address> 
                <Identity xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
                <Dns>localhost</Dns> 
            </Identity>
        </wsa10:EndpointReference>
    </wsdl:port>
    <wsdl:port name="BasicHttpBinding_IMainService" binding="tns:BasicHttpBinding_IMainService">
        <soap:address location="https://localhost/MainService.svc/Soap11" /> 
    </wsdl:port>
</wsdl:service>

尝试将客户端指向任一URL(https://localhost:444/MainService.svc/Soap11或Soap12)但不起作用。我得到一个“内部服务器错误500”作为基本异常“内容类型text / html;响应消息的charset = utf-8与绑定的内容类型不匹配(application / soap + xml; charset = utf -8)“作为最外层的例外。

1 个答案:

答案 0 :(得分:0)

我不确定我是否找到了答案,但我怀疑这里会有更多的活动,所以标记这个答案是没有害处的。这是我发现的。

我上面的配置显然是正确的,但是,虽然我没有在网上看到任何有关这方面的信息,但无论你的服务有多少端点,基本地址都会找到元数据。看起来好像您需要使用基地址为客户端生成代理,然后将您的代码重新命名为/ Soap11或/ Soap12地址。

我已经成功地使用来自客户端的basicHttpBinding向Soap11发送了调用,但是使用wsHttpBinding未能成功与Soap12通信,尽管我不认为这个通信问题与手头的问题有关。

我唯一的保留是,似乎应该有一种方法可以指向单个URL来获取您的WSDL并发送您的通信,尽管您不能使用此解决方案。