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 开发服务器)的主要内容,如果未能解决你的问题,请参考以下文章