Как добавить собственный заголовок HTTP к каждому вызову WCF? - PullRequest
149 голосов
/ 08 июня 2009

У меня есть служба WCF, которая размещена в службе Windows. Клиенты, которые используют эту службу, должны передавать идентификатор каждый раз, когда они вызывают методы службы (потому что этот идентификатор важен для того, что должен делать вызываемый метод). Я подумал, что было бы неплохо как-то поместить этот идентификатор в информацию заголовка WCF.

Если это хорошая идея, как я могу автоматически добавить идентификатор к информации заголовка. Другими словами, всякий раз, когда пользователь вызывает метод WCF, идентификатор должен автоматически добавляться в заголовок.

UPDATE: Клиентами, которые используют службу WCF, являются как приложения Windows, так и приложения Windows Mobile (с использованием Compact Framework).

Ответы [ 12 ]

1 голос
/ 05 мая 2015

Это то, что сработало для меня, адаптировано с Добавление заголовков HTTP к вызовам WCF

// Message inspector used to add the User-Agent HTTP Header to the WCF calls for Server
public class AddUserAgentClientMessageInspector : IClientMessageInspector
{
    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
    {
        HttpRequestMessageProperty property = new HttpRequestMessageProperty();

        var userAgent = "MyUserAgent/1.0.0.0";

        if (request.Properties.Count == 0 || request.Properties[HttpRequestMessageProperty.Name] == null)
        {
            var property = new HttpRequestMessageProperty();
            property.Headers["User-Agent"] = userAgent;
            request.Properties.Add(HttpRequestMessageProperty.Name, property);
        }
        else
        {
            ((HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]).Headers["User-Agent"] = userAgent;
        }
        return null;
    }

    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
    }
}

// Endpoint behavior used to add the User-Agent HTTP Header to WCF calls for Server
public class AddUserAgentEndpointBehavior : IEndpointBehavior
{
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(new AddUserAgentClientMessageInspector());
    }

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
    }

    public void Validate(ServiceEndpoint endpoint)
    {
    }
}

После объявления этих классов вы можете добавить новое поведение к вашему клиенту WCF следующим образом:

client.Endpoint.Behaviors.Add(new AddUserAgentEndpointBehavior());
0 голосов
/ 28 апреля 2015

Немного опоздал на вечеринку, но Джувал Лоуи подробно описывает этот сценарий в своей книге и соответствующей библиотеке ServiceModelEx .

По сути, он определяет специализации ClientBase и ChannelFactory, которые позволяют указывать безопасные для типов значения заголовков. Я предлагаю загрузить исходный код и посмотреть на классы HeaderClientBase и HeaderChannelFactory.

John

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