Операция контракта «DownloadStream» требует идентификации Windows для автоматического олицетворения - PullRequest
1 голос
/ 02 апреля 2011

Я недавно изменил свои конфигурации привязки, чтобы разрешить олицетворение в моей службе WCF. Реализуя это, я должен был использовать буферизованный TransferMode.Buffered, а не потоковый. Хотя это, казалось, решало мои проблемы на некоторое время, я заметил, что большие файлы (> 200 МБ) выдают исключение при попытке выделить MemoryStream для передачи сообщения. Мои коллеги, а также Google заставили меня поверить, что ответом был Chunking, и с тех пор я пытался реализовать версию этого образца:

MSDN Chunking Article

Я изменил класс TCPChunkingBinding для получения из BasicHttpBinding вместо Binding и добавил необходимые атрибуты BasicHttpSecurity, которые мы использовали перед попыткой разбиения на фрагменты.

Все конечные точки, которые ранее использовали BasicHttpBinding, теперь используют TCPChunkingBinding. Вот изменения, которые я сделал в классе TCPChunkingBinding:

TcpChunkingBinding : BasicHttpBinding, IBindingRuntimePreferences

...

void Initialize()
    {
        be = new ChunkingBindingElement();
        tcpbe = new TcpTransportBindingElement();
        tcpbe.TransferMode = TransferMode.Buffered; //no transport streaming
        tcpbe.MaxReceivedMessageSize = ChunkingUtils.ChunkSize + 100 * 1024; //add 100KB for headers
        this.MessageEncoding = WSMessageEncoding.Mtom;
        this.SendTimeout = new TimeSpan(0, 5, 0);
        this.ReceiveTimeout = this.SendTimeout;
        this.TransferMode = TransferMode.Buffered;

        BasicHttpSecurity security = new BasicHttpSecurity();
        security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
        security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
        security.Transport.Realm = string.Empty;
        security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
        security.Message.AlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Default;
        this.Security = security;

Я получаю ошибку

The contract operation 'DownloadStream' requires Windows identity for automatic impersonation. A Windows identity that represents the caller is not provided by binding ('TcpChunkingBinding','http://tempuri.org/') for contract ('ITestService','http://tempuri.org/'.

Когда я вызываю host.open () в Host.cs класса Service в примере.

По сути, мой вопрос: может ли кто-нибудь помочь мне понять, как заставить этот образец работать с имитацией и разбивкой?

Прежде чем кто-нибудь ответит, перед тем, как попробовать пробиться по чанкингу, я использовал все настройки буфера и не могу использовать режим потоковой передачи из-за необходимости подражания. Заранее спасибо.

...