我一直在尝试构建一个 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);
}
}
}
}
}
}
}
我已经阅读了有关此问题的各种其他帖子,但似乎找不到任何线索。