Доступ к базовому объекту Request(WebRequest или HTTPRequest) в WCF для дайджест-предварительной аутентификации
Мы выставляем объекты Entity через WCF Services. Для извлечения сущностей мы делаем несколько запросов через WCF, близких к 100 или более. Недавно мы переключились на дайджест-аутентификацию и заметили, что каждый запрос к серверу выдает 401. Это создает вдвое большую нагрузку на сервер, и, поскольку у нас очень большие "сообщения", это создаст дополнительную задержку трафика. Цель состоит в том, чтобы иметь только один вызов (401) от сервера, а остальные запросы должны включать в себя заголовок Auth, чтобы сервер не выдавал 401. Поскольку Digest является протоколом на основе запросов с истекающим одноразовым номером, даже если мы не можем полностью устранить 401, но, по крайней мере, избегать их при каждом запросе. Поскольку мы контролируем и сервер, и клиента, мы хотим отправлять заголовок Digest Auth, включенный в каждый запрос. Существует свойство предварительной проверки подлинности в прокси / клиенте веб-ссылки стиля веб-сервисов.NET 2.0 (который наследует SOAPHttpClientProtocol), которое позволяет включать заголовок Auth в запрос, но с клиентом веб-ссылки служб WCF (который использует ChannelFactory) нет. "т. Существует четкое различие в трафике Запрос / Ответ, когда это свойство установлено, а когда нет. Поскольку это Digest Authentication(НЕ Basic), я не могу добавить заголовок Auth вручную во время BeginRequest с ClientMessageInspector.
NetworkCredential creds = new NetworkCredential("username", "pass", "domain");
//using .NET 2.0 "Web Reference" Style client that uses inherits SoapHttpClientProtocol:
webReferenceClient = new Service1();
webReferenceClient.Credentials = creds;
//**Pre Authenticate **
webReferenceClient.PreAuthenticate = true;
string resp1 = "";
for (int i = 0; i < 3;i++)
resp1 = resp1 + webReferenceClient.SayHello("jack");
//using WCF "Service Reference" Client that uses ChannelFactory
serviceReferenceClient = new Service1Client();
serviceReferenceClient.ClientCredentials.HttpDigest.ClientCredential = creds;
serviceReferenceClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
string resp="";
for (var i = 0; i < 3;i++)
resp = resp + serviceReferenceClient.SayHello("jack");
Трассировка фиддлера с помощью веб-эталонного клиента в стиле.NET 2.0 с установленной предварительной аутентификацией Обратите внимание, что существует только один 401, а остальные запросы имеют заголовок Auth.
Трассировка с помощью эталонного клиента WCF Style Service. Каждый запрос генерирует 401 с сервера:
Я вижу два варианта:
- Переключите наш клиентский код на использование веб-эталонного клиента в стиле.NET 2.0, это будет большой шаг, так как мы делаем некоторую пользовательскую обработку ошибок.
- Найдите способ получить доступ к объекту WebRequest или HTTPRequest WCF ChannelFactory и установить свойство PreAuthenticate. Как добраться до реального объекта WebRequest??
Есть ли другие варианты??