【发布时间】:2014-04-16 10:11:47
【问题描述】:
我的目标是为 WCF 创建一个端点行为,它向现有合同添加一个额外的 Ping() 操作。 EndpointBehavior 工作正常,当我运行我的服务并使用 WCF 测试客户端时,我实际上可以看到添加的 Ping() 操作。我已按如下方式实现了此端点行为:
配置:
<configuration>
<system.serviceModel>
<services>
<service name="X">
<endpoint address="mex" kind="mexEndpoint" />
<endpoint address="" binding="basicHttpBinding" contract="IX"
behaviorConfiguration="ping" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="ping">
<PingEndpointBehavior />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="PingEndpointBehavior"
type="Assembly.PingEndpointBehavior, Assembly, .. />
<behaviorExtensions>
</extensions>
</system.serviceModel>
</configuration>
端点行为:
public class PingEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior
{
...
public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
EndpointDispatcher endpointDispatcher)
{
var cd = endpoint.Contract;
var inputMessage = new MessageDescription(...);
var outputMessage = new MessageDescription(...);
// Set input/output messages correctly
var od = new OperationDescription("Ping", cd);
od.Messages.Add(inputMessage);
od.Messages.Add(outputMessage);
od.Behaviors.Add(new DataContractSerializerOperationBehavior(od));
od.Behaviors.Add(new PingOperationBehavior());
endpoint.Contract.Operations.Add(od);
}
...
}
但是,操作行为不起作用。操作行为上的ApplyDispatchBehavior() 方法永远不会被调用,因此,我自己的PingInvoker 没有被使用。这导致在调用添加的Ping() 操作到合约时没有得到响应。
原因似乎是OperationBehavior 仅在服务已经启动之后 才被添加,导致ApplyDispactchBehavior 没有被调用。见以下代码:
操作行为:
public class PingOperationBehavior : IOperationBehavior
{
...
public void ApplyDispatchBehavior(OperationDescription od, DispatchOperation do)
{
do.Invoker = new PingInvoker();
}
...
}
调用者:
public class PingInvoker : IOperationInvoker
{
...
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
outputs = new object[0];
return Ping();
}
public static DateTime Ping()
{
return DateTime.Now;
}
...
}
有人知道如何让OperationBehavior 正常工作吗?
注意:
- 应该适用于 IIS 中托管的服务(非自托管)
- 除了在配置中添加行为(并引用包含该行为的程序集)之外,我不想更改服务上的任何内容
【问题讨论】:
-
您是否为 PingEndpointBehavior 实现了 CreateBehavior 方法:受保护的覆盖对象 CreateBehavior()?
-
在您的示例中调用“Ping”时出现合同不匹配。你能提供更多你的代码吗?我也想在我们的应用程序中进行这项工作。
标签: c# wcf endpointbehavior