SHA-1 создает 160-битное сообщение (20 байтов), слишком большое, чтобы его можно было сохранить в значении int
или long
. Как предполагает Ральф, вы можете использовать BigInteger.
Чтобы получить (менее безопасный) int хеш, вы можете вернуть хеш-код возвращенного байтового массива.
В качестве альтернативы, если вам совсем не нужен SHA, вы можете просто использовать строковый хеш-код UUID.
Преимущество этого заключается в том, что он применяется к каждому вызову.
Создайте класс, реализующий 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, которые поддерживаются компактной платформой. Я считаю, что инспекторы сообщений классифицируются как «Расширяемость каналов», которые, согласно этому сообщению, поддерживаются компактной структурой.
Привязки контекста в .NET 3.5 могут быть именно тем, что вы ищете. Есть три готовых варианта: BasicHttpContextBinding, NetTcpContextBinding и WSHttpContextBinding. Протокол контекста в основном передает пары ключ-значение в заголовке сообщения. Ознакомьтесь со статьей Managing State With Durable Services в журнале MSDN.
Вы добавляете его к вызову, используя:
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");
Если я правильно понимаю ваше требование, простой ответ: вы не можете.
Это потому, что клиент службы WCF может быть создан любой третьей стороной, использующей вашу службу.
ЕСЛИ у вас есть контроль над клиентами вашей службы, вы можете создать базовый клиентский класс, который добавит желаемый заголовок и унаследует поведение рабочих классов.
Вы можете указать пользовательские заголовки в MessageContract .
Вы также можете использовать <конечная точка> заголовки , которые хранятся в файле конфигурации и будут скопированы в заголовок всех сообщений, отправленных клиентом / службой. Это полезно для простого добавления статического заголовка.
Если вы просто хотите добавить один и тот же заголовок ко всем запросам к службе, вы можете сделать это без какого-либо кодирования!
Просто добавьте узел заголовков с необходимыми заголовками под узлом конечной точки в файле конфигурации вашего клиента
<client>
<endpoint address="http://localhost/..." >
<headers>
<HeaderName>Value</HeaderName>
</headers>
</endpoint>