2017-05-24 62 views
0

我需要自定义WCF服务中的每个方法 - 添加日志记录。无法将值添加到集合中,因为集合已包含相同类型的项目...

所以,我安装一个专用的操作行为为每个操作时,服务主机创建:

public class CoreServiceHostFactory : ServiceHostFactory 
{ 
    #region Overrides of ServiceHostFactory 

    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     var host = base.CreateServiceHost(serviceType, baseAddresses); 
     var operationBehavior = new WcfOperationBehavior(); 
     host.Description.Endpoints 
      .SelectMany(e => e.Contract.Operations) 
      .ForEach(o => o.Behaviors.Add(operationBehavior)); 

     return host; 
    } 

    #endregion 
} 

它本地工作,但在QA部署时失败,

的数值不被添加到集合中,因为集合 已包含相同类型的项目: ...此集合仅支持 支持每种类型的一个实例。参数名:项目

web.config中的有关条文是:

<services> 
    <service name="DeviceServices.DeviceService" behaviorConfiguration="SLDeviceServices.ServiceBehavior"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="StandardBindingSSL" contract="DeviceServices.IDeviceService"> 
     </endpoint> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="StandardBinding" contract="DeviceServices.IDeviceService"> 
     </endpoint> 
    </service> 
    <service name="DeviceServices.DeviceServiceJSON" behaviorConfiguration="SLDeviceServices.ServiceBehavior"> 
     <endpoint address="" binding="webHttpBinding" bindingConfiguration="StandardBindingSSL" contract="DeviceServices.DeviceServiceJSON" behaviorConfiguration="DeviceServices.JSONDeviceServiceBehavior"> 
     </endpoint> 
     <endpoint address="" binding="webHttpBinding" bindingConfiguration="StandardBinding" contract="DeviceServices.DeviceServiceJSON" behaviorConfiguration="DeviceServices.JSONDeviceServiceBehavior"> 
     </endpoint> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="SLDeviceServices.ServiceBehavior"> 
      <serviceMetadata httpsGetEnabled="false" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="DeviceServices.JSONDeviceServiceBehavior"> 
      <webHttp /> 
     </behavior> 
    </endpointBehaviors> 
</behaviors> 

我不明白是什么问题。任何人?

回答

1

我找到了根本原因。在QA中,该服务有两个端点 - http和https,但两者都绑定到同一个合同。

因此,代码

host.Description.Endpoints 
    .SelectMany(e => e.Contract.Operations) 
    .ForEach(o => o.Behaviors.Add(operationBehavior)); 

横穿同一合同的两倍。解决方法是:

host.Description.Endpoints 
    .Select(e => e.Contract) 
    .Distinct() 
    .SelectMany(c => c.Operations) 
    .ForEach(o => o.Behaviors.Add(operationBehavior)); 
相关问题