powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / MessageInspector SOAP Headers To не отправляется
1 сообщений из 1, страница 1 из 1
MessageInspector SOAP Headers To не отправляется
    #37663360
Prog1TT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал свой MessageInspector для WCF сервиса. Вот его код:
Код: c#
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 содержится следующее:

Код: xml
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 лежит вот это:
Код: xml
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>. Подскажите, пожалуйста, куда она девается? И как сделать, чтобы она всё таки присутствовала в конечном ответе. Сколько не ковырялся - не понял в чём причина.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / MessageInspector SOAP Headers To не отправляется
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]