Я работаю над клиентским/серверным приложением на основе WCF (WCF является самостоятельным, а не IIS).
У службы WCF есть операция для загрузки части данных на сервер. Контракт примерно выглядит следующим образом:
void UploadChunk(int clientId, byte[] chunk);
Мы используем аутентификацию Windows (Kerberos/NTLM), поэтому мы не можем использовать потоки.
Связывание выглядит так (на стороне клиента и сервера):
new BasicHttpBinding
{
Security = new BasicHttpSecurity
{
Mode = BasicHttpSecurityMode.TransportCredentialOnly,
Transport = { ClientCredentialType = HttpClientCredentialType.Windows },
},
MaxReceivedMessageSize = 0x7fffffff,
ReaderQuotas = { MaxArrayLength = 0x800000 },
};
Клиент обращается к службе через прокси-объекты, полученные из System.ServiceModel.ClientBase<TChannel>
.
Все это работает отлично, но мы заметили, что клиент WCF отправляет каждый HTTP-запрос дважды, один раз без заголовка auth и еще раз с правильным заголовком auth. Это проблематично, потому что запросы будут довольно большими, и это приводит к тому, что размер запроса будет в два раза больше фактического размера блока.
Я уже выяснил (https://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like), что параметр WebRequest.PreAuthenticate
- true
запоминает заголовок auth и повторно использует его для последующих запросов.
Однако из того, что я видел до сих пор, WCF не предоставляет механизм для изменения экземпляра WebRequest.
Есть ли какое-либо решение для этой проблемы?