Я пытаюсь создать пример потоковой передачи WCF только для целей тестирования, и я не могу быть уверенным, что это действительно потоковая передача.Режим потоковой передачи WCF не кажется потоковым
Образец очень проста:
- Сервер возвращает большое бинарное содержимое (PDF-файл в данном случае)
- Клиент пишет большое бинарное содержимое в файл.
Однако этот вопрос, кажется, что даже если я считаю, что я правильно настроен как сервер и клиент для потоковой передачи:
- Он не появляется на самом деле быть передача потокового потому что я нарваться
IOException
с сообщениемThe maximum message size quota for incoming messages (65536) has been exceeded
- чтений являются шагом 1536 байт, даже когда я установил свой потоковый буфер 8192 (или любой другой размер)
Полный код хозяин здесь:
using System;
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace WcfStreamingHost
{
internal class Program
{
private static void Main(string[] args)
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.TransferMode = TransferMode.Streamed;
binding.MaxBufferSize = 65536;
binding.MaxReceivedMessageSize = 65536;
binding.ReaderQuotas.MaxBytesPerRead = 65536;
binding.SendTimeout = TimeSpan.FromMinutes(10);
ServiceHost host = new ServiceHost(typeof (ContentProvider), new Uri("http://charles-m4600:1234/contentprovider"));
host.Description.Behaviors.Add(new ServiceMetadataBehavior());
host.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
host.AddServiceEndpoint(typeof (IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
host.AddServiceEndpoint(typeof (IContentProvider), binding, "streamed");
host.Open();
Console.ReadKey();
}
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class ContentProvider : IContentProvider
{
#region IContentProvider Members
[OperationBehavior(AutoDisposeParameters = true)]
public Stream GetFile()
{
Stream stream = File.OpenRead("large_file.pdf");
return stream;
}
#endregion
}
[ServiceContract]
public interface IContentProvider
{
[OperationContract]
Stream GetFile();
}
}
И полный клиентский код здесь:
using System;
using System.IO;
using System.ServiceModel;
using WcfStreamingClient.LocalSvc;
namespace WcfStreamingClient
{
internal class Program
{
private static void Main(string[] args)
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.TransferMode = TransferMode.Streamed;
binding.MaxBufferSize = 65536;
binding.MaxReceivedMessageSize = 65536;
binding.ReaderQuotas.MaxBytesPerRead = 65536;
binding.ReceiveTimeout = TimeSpan.FromMinutes(10);
EndpointAddress address = new EndpointAddress("http://charles-m4600:1234/contentprovider/streamed");
using (ContentProviderClient client = new ContentProviderClient(binding, address))
{
using (Stream stream = client.GetFile())
{
FileInfo file = new FileInfo("output.pdf");
if (file.Exists)
{
file.Delete();
}
using (FileStream fileStream = file.Create())
{
const int bufferLen = 8192;
byte[] buffer = new byte[bufferLen];
int count = 0;
int total = 0;
while ((count = stream.Read(buffer, 0, bufferLen)) > 0)
{
fileStream.Write(buffer, 0, count);
total += count;
Console.Out.WriteLine("Read {0} bytes", total);
}
}
}
}
}
}
}
Я прочитал ряд других сообщений по этому вопросу, но не могу найти какие-либо улики.
Я хотел бы добавить, что я могу заставить его работать нормально, если я установить 'MaxReceivedMessageSize' для' Int32.MaxValue'. Хотя казалось бы, что это больше не «потоковая передача» в диспетчере задач Windows, это подтверждает, что профиль памяти отличается, когда я устанавливаю его в «Streamed» и «Buffered». Тем не менее, мне все же интересно, почему - в потоковом режиме - мне нужно установить «MaxReceivedMessageSize» на «Int32.MaxValue» и почему мои чтения настолько малы. –