WCF大数据量传输

对于WCF服务来说,默认情况下,其接收的最大数据量为65535字节。如超过这个范围,就必须修改默认设置。

1 客户端。客户端接收的最大数据值由传输协议的MaxReceivedMessageSize确定,示例如下:

代码
class Program
{
static void Main(string[] args)
{

Console.WriteLine(
"Invocate self-host GetPictureFilestreem service... ...");

XmlDictionaryReaderQuotas quotas
= new XmlDictionaryReaderQuotas();
quotas.MaxArrayLength
= 65535;


BasicHttpBinding httpBinding
= new BasicHttpBinding();
httpBinding.ReaderQuotas
= quotas;
httpBinding.MaxReceivedMessageSize
= 6553600;
EndpointAddress httpAddress
= new EndpointAddress("http://localhost:8888/PictureStreemTransfers");

WCFStreemTransfersClient client
= new WCFStreemTransfersClient(httpBinding, httpAddress);
string desPath = System.Environment.CurrentDirectory + "\\result.jpg";
byte[] buf = client.GetPictureFilestreem();
File.WriteAllBytes(desPath,buf);

Console.WriteLine(
@"write file =" + desPath);
Console.Read();

}
}

上例中调用服务端的GetPictureFilestreem()契约,获取返回的2进制数据流,写入result.jpg文件。

由于数据流的长度大于65535,所以通过设定

    quotas.MaxArrayLength = 65535;
            httpBinding.ReaderQuotas = quotas;
            httpBinding.MaxReceivedMessageSize = 6553600;

修改客户端接收的最大数据值。

上例中关联client定义如下:

代码
class WCFStreemTransfersClient : ClientBase<IStreemTransfers>, IStreemTransfers
{
public WCFStreemTransfersClient() : base()
{ }

public WCFStreemTransfersClient(string endpointName)
:
base(endpointName)
{ }

public WCFStreemTransfersClient(Binding binding, EndpointAddress address)
:
base(binding, address)
{ }

public byte[] GetPictureFilestreem() {
return this.Channel.GetPictureFilestreem();
}
}

//IStreemTransfers
[ServiceContract]
public interface IStreemTransfers
{
[OperationContract]
byte[] GetPictureFilestreem();
}

 

 

2 服务端。

wcf并没有限制服务端发送数据的大小,因此服务端简单实现该服务契约就可以了。

服务契约接口:

[ServiceContract]
public interface IStreemTransfers
{
[OperationContract]
byte[] GetPictureFilestreem();
}

 

 

//服务端实现

代码
class Program
{
static void Main(string[] args)
{
ServiceHost host
= new ServiceHost(typeof(PictureStreemTransfers));
host.Open();
Console.WriteLine(
"服务中");
Console.Read();
Console.Read();
}
}

//GetPictureFilestreem
public class PictureStreemTransfers : IStreemTransfers
{
public byte[] GetPictureFilestreem() {
try
{
string path = System.Environment.CurrentDirectory + "\\test.jpg";
Console.WriteLine(
"Server send File = " + path);
return File.ReadAllBytes(path);
}
catch (Exception ex) {
Console.WriteLine(
"Server Error:" + ex.Message);
return null;
}
}

 

 

posted on 2010-06-04 15:32  钟湘光  阅读(2138)  评论(1编辑  收藏  举报

导航