Как просмотреть SOAP-сообщение в сервисе WCF перед выполнением любой контрактной работы? - PullRequest
1 голос
/ 27 марта 2019

У меня есть служба WCF, полученная из WSDL, предоставленного поставщиком. Когда клиент поставщика звонит в мой сервис, он получает сообщение об ошибке "The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher."

Я хотел бы посмотреть входящее сообщение SOAP, прежде чем эта ошибка будет выдана.

Я пытался создать атрибут с IServiceBehavior:

 [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
 public sealed class AuditServiceBehavior : Attribute, IServiceBehavior
 {
    public AuditServiceBehavior() {  }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
        Trace.TraceInformation("AuditService.AddBindingParameters called.");
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        // Seems like the right place to invoke something?
        Trace.TraceInformation("AuditService.ApplyDispatchBehavior called.");
    }
 }

Добавление этого атрибута в мою реализацию сервиса позволяет мне видеть сообщения Trace, но они происходят при запуске сервиса. Я добавил атрибут с IOperationBehavior, но похоже, что все методы здесь имеют место после разрешения контрактов.

Что мне нужно сделать, чтобы увидеть входящий SOAP?

1 Ответ

1 голос
/ 28 марта 2019

Вы можете настроить ActionMessageFilter, ActionMessageFilter используется для соответствия действию мыльного сообщения.

public  class MyActionMesageFilter:ActionMessageFilter
{
    public MyActionMesageFilter(params string[] actions):base(actions)
    {

    }

    public override bool Match(Message message)
    {
        string mes = message.ToString();
        bool re = base.Match(message);
       string action = message.Headers.Action;
        return  re;
    }
}

Добавить endpointBehavior.

 public class ReplaceActionFilterEndpointBehavior : IEndpointBehavior
{
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {

    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {

    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {

                   endpointDispatcher.AddressFilter = new MyActionMesageFilter("http://tempuri.org/IEmployeeService/GetEmployee");

    }

    public void Validate(ServiceEndpoint endpoint)
    {

    }
}

И хост.

 using (ServiceHost host = new ServiceHost(typeof(Service.EmployeeService)))
        {
            host.Description.Endpoints[0].EndpointBehaviors.Add(new ReplaceActionFilterEndpointBehavior());
            host.Opened += delegate
            {
                Console.WriteLine("hello");
            };
            host.Open();
              Console.Read();
        }

Результат.

enter image description here

Для получения дополнительной информации о настройке ActionMessageFilter вы можете обратиться к https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/custom-message-filter

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