Инспектор сообщений WCF на клиенте показывает сообщение, отличное от инспектора сообщений в службе dthe

Мне нужно создать клиент (WCF), который взаимодействует со службой, которая ожидает, что сообщения будут подписаны. Поскольку я новичок в WCF, я сначала попытался настроить простую службу самообслуживания и клиент, который общается с этим сервером.

И у службы, и у клиента есть инспекторы сообщений, поэтому я могу видеть, что происходит за линией.

Однако странно то, что MessageInspector на клиенте НЕ показывает подписи сообщения, в то время как MessageInspector на службе показывает заголовок Security.

Мой вопрос в том, могу ли я повлиять на момент вызова инспектора сообщений, я думаю, что он вызывается до того, как WCF подписал сообщение.

Я использую следующий код на стороне клиента без дополнительных настроек конфигурации:

EndpointAddress address = new EndpointAddress("http://localhost:8001/Someplace/CalculatorService");
WSHttpBinding wsbinding = new WSHttpBinding(SecurityMode.Message);

ChannelFactory<ICalculator> factory = new ChannelFactory<ICalculator>(wsbinding, address);
factory.Endpoint.Behaviors.Add(new MyBehaviour());
factory.Credentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, 
    StoreName.My,X509FindType.FindBySubjectName, "MyCertificate");
factory.Credentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.CurrentUser, 
    StoreName.AddressBook, X509FindType.FindBySubjectName, "MyCertificate");

ICalculator client = factory.CreateChannel();
var total = client.Add(10, 20);

....

class MyInspector : IClientMessageInspector

   public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
   {
       Console.WriteLine("IClientMessageInspector.AfterReceiveReply called.");
       Console.WriteLine("Message: {0}", reply.ToString());
   }
   public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
   {
       Console.WriteLine("IClientMessageInspector.BeforeSendRequest called.");
       Console.WriteLine("Message: {0}", request.ToString());
       return null;
   }

class MyBehaviour : IEndpointBehavior

   public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
   {
       return;
   }
   public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
   {
       clientRuntime.MessageInspectors.Add(new MyInspector());
   }
   public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
   {
   }
   public void Validate(ServiceEndpoint endpoint)
   {
       return;
   }
}

person Paul Greefhorst    schedule 09.06.2011    source источник


Ответы (1)


Нет, вы не можете контролировать, когда в конвейере вызываются инспекторы сообщений. Вместо использования инспекторов сообщений для проверки сообщений используйте трассировку сообщений WCF + svctraceviewer.exe.

http://msdn.microsoft.com/en-us/library/ms733025.aspx

http://msdn.microsoft.com/en-us/library/ms732023.aspx

person larsw    schedule 09.06.2011