テスト目的のためだけに WCF ストリーミングの例を作成しようとしましたが、実際にストリーミングされているかどうかはわかりません。
サンプルは非常に基本的なものです。
- サーバーは大きなバイナリ コンテンツを返します (この場合は PDF ファイル)
- クライアントが大きなバイナリ コンテンツをファイルに書き込みます。
ただし、ストリーミング転送用にサーバーとクライアントの両方を正しく構成したと信じているにもかかわらず、問題があるようです。
IOException
メッセージに遭遇しているため、実際にはストリーミング転送ではないようですThe maximum message size quota for incoming messages (65536) has been exceeded
- ストリーム バッファを 8192 (またはその他のサイズ) に設定した場合でも、読み取りは 1536 バイト単位で行われます。
完全なホスト コードは次のとおりです。
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);
}
}
}
}
}
}
}
この問題に関する他のさまざまな投稿を読みましたが、手がかりが見つからないようです。