Как добавить пользовательский HTTP-заголовок к каждому вызову WCF?

SHA-1 создает 160-битное сообщение (20 байтов), слишком большое, чтобы его можно было сохранить в значении int или long. Как предполагает Ральф, вы можете использовать BigInteger.

Чтобы получить (менее безопасный) int хеш, вы можете вернуть хеш-код возвращенного байтового массива.

В качестве альтернативы, если вам совсем не нужен SHA, вы можете просто использовать строковый хеш-код UUID.

157
задан Ian Kemp 19 April 2017 в 12:11
поделиться

6 ответов

Преимущество этого заключается в том, что он применяется к каждому вызову.

Создайте класс, реализующий IClientMessageInspector . В методе BeforeSendRequest добавьте свой собственный заголовок в исходящее сообщение. Это может выглядеть примерно так:

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request,  System.ServiceModel.IClientChannel channel)
{
    HttpRequestMessageProperty httpRequestMessage;
    object httpRequestMessageObject;
    if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
    {
        httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
        if (string.IsNullOrEmpty(httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER]))
        {
            httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER] = this.m_userAgent;
        }
    }
    else
    {
        httpRequestMessage = new HttpRequestMessageProperty();
        httpRequestMessage.Headers.Add(USER_AGENT_HTTP_HEADER, this.m_userAgent);
        request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
    }
    return null;
}

Затем создайте поведение конечной точки, которое применяет инспектор сообщений к среде выполнения клиента. Вы можете применить поведение через атрибут или через конфигурацию, используя элемент расширения поведения.

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

Это то, что вы имели в виду?

Обновление: Я нашел этот список функций WCF, которые поддерживаются компактной платформой. Я считаю, что инспекторы сообщений классифицируются как «Расширяемость каналов», которые, согласно этому сообщению, поддерживаются компактной структурой.

180
ответ дан 23 November 2019 в 21:44
поделиться

Привязки контекста в .NET 3.5 могут быть именно тем, что вы ищете. Есть три готовых варианта: BasicHttpContextBinding, NetTcpContextBinding и WSHttpContextBinding. Протокол контекста в основном передает пары ключ-значение в заголовке сообщения. Ознакомьтесь со статьей Managing State With Durable Services в журнале MSDN.

2
ответ дан 23 November 2019 в 21:44
поделиться

Вы добавляете его к вызову, используя:

using (OperationContextScope scope = new OperationContextScope((IContextChannel)channel))
{
    MessageHeader<string> header = new MessageHeader<string>("secret message");
    var untyped = header.GetUntypedHeader("Identity", "http://www.my-website.com");
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);

    // now make the WCF call within this using block
}

А затем на стороне сервера вы берете его, используя:

MessageHeaders headers = OperationContext.Current.IncomingMessageHeaders;
string identity = headers.GetHeader<string>("Identity", "http://www.my-website.com");
79
ответ дан 23 November 2019 в 21:44
поделиться
​​

Если я правильно понимаю ваше требование, простой ответ: вы не можете.

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

ЕСЛИ у вас есть контроль над клиентами вашей службы, вы можете создать базовый клиентский класс, который добавит желаемый заголовок и унаследует поведение рабочих классов.

2
ответ дан 23 November 2019 в 21:44
поделиться

Вы можете указать пользовательские заголовки в MessageContract .

Вы также можете использовать <конечная точка> заголовки , которые хранятся в файле конфигурации и будут скопированы в заголовок всех сообщений, отправленных клиентом / службой. Это полезно для простого добавления статического заголовка.

2
ответ дан 23 November 2019 в 21:44
поделиться

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

<client>  
  <endpoint address="http://localhost/..." >  
    <headers>  
      <HeaderName>Value</HeaderName>  
    </headers>   
 </endpoint>  
32
ответ дан 23 November 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: