Я недавно изменил свои конфигурации привязки, чтобы разрешить олицетворение в моей службе 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 в примере.
По сути, мой вопрос: может ли кто-нибудь помочь мне понять, как заставить этот образец работать с имитацией и разбивкой?
Прежде чем кто-нибудь ответит, перед тем, как попробовать пробиться по чанкингу, я использовал все настройки буфера и не могу использовать режим потоковой передачи из-за необходимости подражания. Заранее спасибо.