C# IIS 托管 WCF 服务不生成客户端终结点

C# IIS Hosted WCF service doesn't generate client endpoints

我在 Visual Studio 2013 年使用 C# 创建了 WCF 服务,并将其托管在 IIS 服务器上。我在新的 WPF 客户端中使用服务时遇到问题,因为添加服务引用后端点丢失。

我可以使用 URL 访问该服务,这为我提供了说明页面,说明我需要创建一个客户端才能测试该服务。 URL 适用于服务器和我的笔记本电脑。 WSDL 确实存在,而且我能够查看 XML 结构。 Visual Studio 让我使用 WSDL URL 添加服务引用,并正确生成代理客户端代码。

添加服务引用不会将任何端点添加到我客户的 App.Config 文件中。 WSDL 中的 Ctrl-F 显示 WSDL 中没有任何端点数据。由不同部门托管的另一项服务的 WSDL 确实包括它们的端点,所以我知道它们应该以这种方式列出。

我可以做些什么来让 WSDL 自动向客户端添加端点配置?我不想记住每个新客户端的端点,或要求其他使用该服务的人每次都向我索取。

根据 this MSDN article 我已经尝试添加一个部分并在该部分中重复端点,重建我的服务,重新启动 IIS 服务器上的主机网站,并更新我的服务参考,但端点仍然没有'已添加。

当我在“添加服务引用”对话框中使用“发现”选项时,它确实找到了服务项目,但给出了一个错误,指出 URL 不正确。另一个仅包含样板服务信息的测试解决方案适用于该解决方案中的客户端项目,并将端点添加到客户端配置中。 Web.Config 中没有任何我遇到问题的服务没有的东西。

可能重复了 this question,但没有人回答。

这是来自我的主机网站的 Web.Config 的相关部分(服务的 App.Config 是相同的):

<system.serviceModel>
<client>
  <endpoint binding="webHttpBinding"
            contract="TestLib.Service.ITestLibService" />
</client>
<services>
  <service name="TestLib.Service.TestLibManager">
    <endpoint binding="webHttpBinding" contract="TestLib.Service.ITestLibService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>
<bindings>
  <webHttpBinding>
    <binding>
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" proxyCredentialType="Windows"/>
      </security>          
    </binding>
  </webHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceMetadata httpGetEnabled="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

感谢任何帮助,谢谢!

答案:使用基于 SOAP 的端点绑定,而不是基于 REST

端点绑定有两种不同的类型:SOAP 和 REST。您的服务可以将两者都包含在 web.config 文件中,只要它们具有不同的地址即可,但只有 SOAP 端点会列在 WSDL 中。不需要额外的设置或配置,服务会自动获取此信息,只要它是受支持的类型。

webHttpBinding 是一个基于 REST 的端点绑定。它适用于使用该服务的 JSON/JavaScript 个客户端,但不会在 WSDL 中列出。

basicHttpBinding 是一个基于 SOAP 的端点绑定。它适用于 C# 客户端。如果您使用 Visual Studio 添加服务引用,它会自动将这些端点添加到您的 app.config 文件,它可以这样做,因为该信息列在 WSDL 中。

感谢@nodots 为我指明了正确的方向。