C# WCF 元数据端点不工作(IIS 和 ASP.NET 开发服务器)

Posted

技术标签:

【中文标题】C# WCF 元数据端点不工作(IIS 和 ASP.NET 开发服务器)【英文标题】:C# WCF MetaData endpoint not working (IIS & ASP.NET Development Server) 【发布时间】:2011-09-29 22:13:44 【问题描述】:

我有一个胖客户端,它在多个 WCF 服务上打开通道。这些服务是使用 C#、WCF、nHibernate、Fluent 和 Unity (ServiceHostFactory) 构建的。

当我尝试通过浏览器访问 Plate.svc 的元数据时,我收到一个 400 错误请求,尽管来自应用程序的良好请求会生成任何日志语句,但它不会生成任何日志语句。来自应用程序的所有请求都正常工作。

有什么想法吗?

我已包含以下文件的重要部分:

    服务标记 服务合同 服务 Web.config 客户端 App.config

1. 服务标记

ServiceHost Language="C#" Debug="true" Service="PRO.Services.PlateService" CodeBehind="Plate.svc.cs" Factory="PRO.Services.Configuration.UnityServiceHostFactory"

2. 服务合同

命名空间 PRO.ServiceContracts [服务合同] 公共接口 IPlateService [运营合同] [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest)] [FaultContract(typeof(string))] AnalysisPlate 搜索(字符串条形码); // 相同定义的操作被移除

3. 服务Web.config

   <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpEndpointBinding">
          <security mode="None">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ProBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
    <services>
      <service behaviorConfiguration="ProBehavior" name="PRO.Services.PlateService">
        <endpoint address="" contract="PRO.ServiceContracts.IPlateService"
                  binding="basicHttpBinding" bindingConfiguration="BasicHttpEndpointBinding"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
      <service behaviorConfiguration="ProBehavior" name="PRO.Services.SampleService">
        <endpoint address="" contract="PRO.ServiceContracts.ISampleService" 
                  binding="basicHttpBinding" bindingConfiguration="BasicHttpEndpointBinding"/>
      </service>
    </services>
   </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
    </modules>
  </system.webServer>

4. 客户端App.config

 <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_Normal">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:4829/Sample.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Normal" contract="PRO.ServiceContracts.ISampleService" name="DEV_ISampleService" />
      <endpoint address="http://localhost:4829/Plate.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Normal" contract="PRO.ServiceContracts.IPlateService" name="DEV_IPlateService" />
    </client>
  </system.serviceModel>

【问题讨论】:

我不确定这是您问题的根源,但您是否注意到您在客户端和服务器上使用的绑定略有不同。服务器设置为 SecurityMode="None",但客户端设置为“TransportCredentialOnly”。这是有原因的吗? 我还发现在调试此类问题时启用 WCF 服务跟踪和使用服务跟踪查看器非常有用。详情见这篇文章:msdn.microsoft.com/en-us/library/ms733025.aspx 1.这不应该是 MetaData 的问题,因为在这种情况下不会使用客户端定义。 2.尝试通过浏览器访问元数据时,WCF 服务跟踪是否会有所帮助?我问是因为我在我的开发服务器中打开了它,我看到的唯一语句来自客户端数据请求。 MetaData 请求中没有任何内容。 我发现我有两个日志!尝试从浏览器访问服务/mex 会引发异常“无法读取消息正文,因为它是空的。”如果我启用 get,我认为不会发生这种情况。 【参考方案1】:

原来问题与使用工厂 Factory="PRO.Services.Configuration.UnityServiceHostFactory"

有关

关于这件事有两件事没有得到很好的记录:

1) 将 ServiceHost 与您的工厂结合使用(不是 WebServiceHost) 2) 您可能需要在自定义服务主机中设置您的 MetaData 端点,详见 Microsoft 的这篇文章:http://msdn.microsoft.com/en-us/library/aa395224.aspx

【讨论】:

以上是关于C# WCF 元数据端点不工作(IIS 和 ASP.NET 开发服务器)的主要内容,如果未能解决你的问题,请参考以下文章

WCF 托管在 Web 应用程序和兼容模式中

创建 WCF 服务网站

WCF - 无法获取元数据

带有消息的零星 WCF 服务激活错误 - 访问 IIS 元数据库时发生错误

基于 IIS 绑定将 WCF 端点动态绑定到 HTTPS

WCF 使用凭据和 IIS 以编程方式启用 TLS