Написал свой MessageInspector для WCF сервиса. Вот его код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;
using System;
namespace UnifoRouter
{
/// <summary>
/// в поле "To" ставит то, что было в поле "From" заголовка исходного
/// сообщения, генерирует новый MessageId, а старый ставит в RelatesTo.
/// </summary>
public class HeadersMessageInspector : IDispatchMessageInspector
{
#region IDispatchMessageInspector Members
/// <summary>
/// Обработка события, возникающего перед обработкой принятого сообщения.
/// </summary>
/// <param name="request"></param>
/// <param name="channel"></param>
/// <param name="instanceContext"></param>
/// <returns></returns>
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,
IClientChannel channel,
InstanceContext instanceContext)
{
Loggers.Main.Info("HeadersMessageInspector.AfterReceiveRequest begin.");
MessageHeaders correlationState = new MessageHeaders(request.Headers);
Loggers.Main.Info("HeadersMessageInspector.AfterReceiveRequest end.");
return correlationState;
}
/// <summary>
/// Обработка события, возникающего перед отправкой ответа на
/// принятое сообщение.
/// </summary>
/// <param name="reply"></param>
/// <param name="correlationState"></param>
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply,
object correlationState)
{
Loggers.Main.Info("HeadersMessageInspector.BeforeSendReply begin.");
try
{
MessageHeaders headersRequest = (MessageHeaders)correlationState;
MessageHeaders headersReply = new MessageHeaders(reply.Headers);
reply.Headers.Clear();
if (headersRequest.From != null)
{
Loggers.Main.Info("headersRequest.From="+headersRequest.From);
Loggers.Main.Info("headersRequest.From.Uri=" + headersRequest.From.Uri);
if (headersRequest.From.Headers.Count > 0)
{
Loggers.Main.Info("headersRequest.From.Headers[0].Name=" + headersRequest.From.Headers[0].Name);
}
reply.Headers.To = new Uri(headersRequest.From.Uri.AbsoluteUri);
}
else
{
Loggers.Main.Error("headersRequest.From is null.");
}
reply.Headers.From = new EndpointAddress(headersRequest.To);
reply.Headers.RelatesTo = headersRequest.MessageId;
reply.Headers.MessageId = new System.Xml.UniqueId(System.Guid.NewGuid());
reply.Headers.Action = headersReply.Action;
MessageHeader messageType = MessageHeader.CreateHeader("MessageType",
"urn:mv:nadzor:v0.1", "Electronic");
reply.Headers.Add(messageType);
}
catch (Exception ex)
{
Loggers.Main.Error(ex.Message, ex);
}
Loggers.Main.Info("HeadersMessageInspector.BeforeSendReply end.");
}
#endregion
}
}
Методы AfterReceiveRequest, BeforeSendReply успешно вызываются и отрабатывают.
BeforeSendReply в начале выполнения внутри reply содержится следующее:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<a:Action s:mustUnderstand="1">http://test.ru/wsdl/Collaboration/Binding/ICollaborationService/ExportDataResponse</a:Action>
<ActivityId CorrelationId="5fe3ad99-a22e-4dff-bad0-8e08ee1fcace" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">3c60dcd0-2e1b-4eef-969c-2912dd4e3696</ActivityId>
<a:RelatesTo>3608EB2A-3843-4dc2-85B5-332E09C542DA</a:RelatesTo>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
.................
</s:Body>
</s:Envelope>
В конце выполнения BeforeSendReply в reply лежит вот это:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<a:To s:mustUnderstand="1">urn:sv:test_unifo_client@internet.ru</a:To>
<a:From>
<a:Address>urn:sv:unifo2@internet.ru</a:Address>
</a:From>
<a:RelatesTo>3608EB2A-3843-4dc2-85B5-332E09C542DA</a:RelatesTo>
<a:MessageID>urn:uuid:97cd2a06-9b2e-4a5d-9ad6-b715536cac19</a:MessageID>
<a:Action s:mustUnderstand="1">http://test.ru/wsdl/Collaboration/Binding/ICollaborationService/ExportDataResponse</a:Action>
<MessageType xmlns="urn:mv:nadzor:v0.1">Electronic</MessageType>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
................
</s:Body>
</s:Envelope>
Но клиенту отправляется уже без строчки <a:To s:mustUnderstand="1">urn:sv:test_unifo_
client@internet.ru</a:To>. Подскажите, пожалуйста, куда она девается? И как сделать, чтобы она всё таки присутствовала в конечном ответе. Сколько не ковырялся - не понял в чём причина.