我有一个自定义的OperationBehavior。我想立即将它应用于所有操作。 遗憾的是,无法在整个服务或web.config中配置OperationBehaviors。
在测试应用程序中托管WCF服务时,我可以执行以下操作:
foreach (var ep in _serviceHost.Description.Endpoints)
{
foreach (OperationDescription od in ep.Contract.Operations)
{
od.Behaviors.Add(new MyOperationBehavior());
}
}
_serviceHost.Open();
但是我如何在IIS托管的Web应用程序中执行此操作?
我试图在OperationContext.Current.Host.Description.Endpoints
中获取Application_Start
但当然OperationContext.Current
在任何操作开始之前都不可用,所以我的方法失败了。
答案 0 :(得分:5)
您可以使用ServiceHostFactory
来执行此操作。有了它,您可以在打开服务之前访问OM。
这是一个例子:
public class MyFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
foreach (var ep in host.Description.Endpoints)
{
foreach (OperationDescription od in ep.Contract.Operations)
{
od.Behaviors.Add(new MyOperationBehavior());
}
}
return host;
}
}
您可以在http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/14/wcf-extensibility-servicehostfactory.aspx
获取有关服务主机工厂的更多信息答案 1 :(得分:1)
最后,我找到了另一种解决方案:使用合同行为,根据需要注入任何其他behvaior。像这样:
public class InjectAllOperationsBehavior : Attribute, IContractBehavior
{
private IOperationBehavior _operationBehavior = null;
public InjectAllOperationsBehavior(Type operationBehaviorType)
{
_operationBehavior =
(IOperationBehavior)Activator.CreateInstance(operationBehaviorType);
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
foreach (OperationDescription opDescription in contractDescription.Operations)
{
opDescription.Behaviors.Add(_operationBehavior);
}
}
...其他IContractBehavior方法可以留空。您可能还希望将ApplyClientBehavior方法与ApplyDispatchBehavior方法中的相同代码一起使用。