IClientMessageInspector
на стороне клиента и IDispatchMessageInspector
на стороне сервера хорошо проверяют тело сообщения, потенциально изменяя сообщение перед отправкой или изменяя то, что получено.
Вот пример:
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 полезен для обработки заголовков (добавление, удаление).
Programming WCF Services, Приложение B, от Juval Löwy, довольно хорошо объясняет OperationContextScope. Juval's Framework, ServiceModelEx помогает использовать OperationContextScopes
с классом GenericContext<T>
См. сайт компании Juval для загрузки: http://www.idesign.net/Downloads
С уважением
person
Emmanuel DURIN
schedule
28.09.2015