OperationContextScope 与 MessageInpectors
OperationContextScope vs MessageInpectors
帮助我理解这两者之间的区别。对我来说,操作
无论您使用的是什么 .NET 应用程序,如 WCF、控制台、Web 等,都可以使用 ContextScope,如果您正在调用任何其他服务,如 WCF 或基于 Java 的服务,则可以在任何地方使用它 [这将不起作用ASMX 服务案例] 将 headers 添加到传出消息中。
如果是这样,那为什么我们需要在任何客户端添加 MessageInspectors 来添加 headers? OperationContextScope 比 MessageInspectors 简单得多。有人阐明了这两个的正确用法吗?
客户端的 IClientMessageInspector
和服务器端的 IDispatchMessageInspector
擅长检查消息的 body,可能在发送前修改消息,或修改接收到的内容.
这是一个示例:
public class MyMessageInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
// Inspect and/or modify the message here
MessageBuffer mb = reply.CreateBufferedCopy(int.MaxValue);
Message newMsg = mb.CreateMessage();
var reader = newMsg.GetReaderAtBodyContents().ReadSubtree();
XElement bodyElm = XElement.Load(reader);
// ...
reply = newMsg;
}
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
// Something could be done here
return null;
}
}
编写一个行为来轻松地将检查器应用于客户端:
public class MyInspectorBehavior : IEndpointBehavior
{
#region IEndpointBehavior Members
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(
new MyMessageInspector()
);
}
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{}
public void Validate(ServiceEndpoint endpoint)
{}
#endregion
}
使用行为:
ChannelFactory<IService1> cf =
new ChannelFactory<IService1>(
new BasicHttpBinding(),
"http://localhost:8734/DataService.svc");
cf.Endpoint.Behaviors.Add(
new MyInspectorBehavior()
);
可以在服务器端使用 IDispatcherMessageInspector 完成同样的事情。
该行为可以用 C#、XML (app.config/web.config) 或以声明方式放在服务实现上:
[MyServiceInspectorBehavior]
public class ServiceImpl : IService1
{ ...}
OperationContextScope 可用于处理 headers(添加、删除)。
Juval Löwy 的《WCF 服务编程》附录 B 很好地解释了 OperationContextScope。
Juval 的框架,ServiceModelEx 帮助使用 OperationContextScopes
和 GenericContext<T>
class
请访问 Juval 的公司网站进行下载:http://www.idesign.net/Downloads
此致
帮助我理解这两者之间的区别。对我来说,操作 无论您使用的是什么 .NET 应用程序,如 WCF、控制台、Web 等,都可以使用 ContextScope,如果您正在调用任何其他服务,如 WCF 或基于 Java 的服务,则可以在任何地方使用它 [这将不起作用ASMX 服务案例] 将 headers 添加到传出消息中。
如果是这样,那为什么我们需要在任何客户端添加 MessageInspectors 来添加 headers? OperationContextScope 比 MessageInspectors 简单得多。有人阐明了这两个的正确用法吗?
IClientMessageInspector
和服务器端的 IDispatchMessageInspector
擅长检查消息的 body,可能在发送前修改消息,或修改接收到的内容.
这是一个示例:
public class MyMessageInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
// Inspect and/or modify the message here
MessageBuffer mb = reply.CreateBufferedCopy(int.MaxValue);
Message newMsg = mb.CreateMessage();
var reader = newMsg.GetReaderAtBodyContents().ReadSubtree();
XElement bodyElm = XElement.Load(reader);
// ...
reply = newMsg;
}
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
// Something could be done here
return null;
}
}
编写一个行为来轻松地将检查器应用于客户端:
public class MyInspectorBehavior : IEndpointBehavior
{
#region IEndpointBehavior Members
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(
new MyMessageInspector()
);
}
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{}
public void Validate(ServiceEndpoint endpoint)
{}
#endregion
}
使用行为:
ChannelFactory<IService1> cf =
new ChannelFactory<IService1>(
new BasicHttpBinding(),
"http://localhost:8734/DataService.svc");
cf.Endpoint.Behaviors.Add(
new MyInspectorBehavior()
);
可以在服务器端使用 IDispatcherMessageInspector 完成同样的事情。
该行为可以用 C#、XML (app.config/web.config) 或以声明方式放在服务实现上:
[MyServiceInspectorBehavior]
public class ServiceImpl : IService1
{ ...}
OperationContextScope 可用于处理 headers(添加、删除)。
Juval Löwy 的《WCF 服务编程》附录 B 很好地解释了 OperationContextScope。
Juval 的框架,ServiceModelEx 帮助使用 OperationContextScopes
和 GenericContext<T>
class
请访问 Juval 的公司网站进行下载:http://www.idesign.net/Downloads
此致