首页>>互联网>>大数据->wcf传输最大数据量是多少(2023年最新整理)

wcf传输最大数据量是多少(2023年最新整理)

时间:2023-12-11 本站 点击:0

导读:今天首席CTO笔记来给各位分享关于wcf传输最大数据量是多少的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

wcf是什么

Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。WCF的最终目标是通过进程或不同的系统、通过本地网络或是通过Internet收发客户和服务之间的消息。WCF合并了Web服务、.net Remoting、消息队列和Enterprise Services的功能并集成在Visual Studio中。WCF专门用于面向服务开发。

wcf rest maxreceivedmessagesize最大多少

这个跟是否REST没有关系,默认16K,最大是 byte[] 数组的最大长度,约100MB。

如果需要大体量传输,微软给出的建议是 用Stream作为WCF服务接口的参数。

WCF作用,通俗一点

最通俗而且简练的描述是:进程间通讯。

而wcf服务本身可以使用iis、控制台或者winform等多种宿主,并且,可以通过修改wcf配置文件来配置http、nettcp等多种通讯方式。

wcf 并发量多少

并发是对同时执行的任务数量的度量,单位为任务(如请求、作业、事务等)。执行时间是对完成任务所用时间的度量,单位为时间(如毫秒、秒等)。吞吐量是在固定的时间内完成的任务数量的度量,单位为任务/时间(如请求/秒、事务/秒等)。可以通过减少执行时间或提高并发来提高吞吐量。在WCF中可以通过InstanceContextMode和ConcurrencyMode来控制并发行为。

InstanceContextMode用于控制服务类实例化,可以有以下几种取值:

Single:一个服务类实例处理所有客户端的所有请求。

PerCall:为每一个客户端的每一个请求创建一个服务类实例。

PerSession:为每一个客户端会话创建一个服务类实例(也就是每一个客户端会话的所有请求共用一个服务类实例)。

ConcurrencyMode用来控制服务类实例内的线程并发。有以下取值:

Single:在同一时刻只有一个线程可以访问服务类实例。

Reentrant:在同一时刻只有一个线程访问服务类实例,但是线程能暂时离开服务类实例,稍后回来并继续访问。

Mutiple:多线程能并发访问服务类实例。

下面用简单的代码来展示InstanceContextMode和ConcurrencyMode不同的设置组合对服务类实例化和并发的影响。这次用NetTcpBinding绑定,它支持会话。

服务契约:

using System;

using System.ServiceModel;

namespace IFruitSvc

{

[ServiceContract(Namespace="")]

publicinterface IFruitService

{

[OperationContract]

string GetFruitName();

}

}

服务类:

using System;

using System.ServiceModel;

using IFruitSvc;

using System.Threading;

using System.ServiceModel.Description;

namespace FruitSvc

{

publicclass FruitService:IFruitService

{

FruitService()

{

Console.WriteLine("{0} : Created new instance of FruitService on thread", DateTime.Now.Ticks);

}

publicstring GetFruitName()

{

Console.WriteLine("{0} : GetFruitName called on thread {1} ", DateTime.Now.Ticks,

Thread.CurrentThread.ManagedThreadId);

return"banana";

}

}

}

服务端寄存:

using System;

using System.ServiceModel;

using System.ServiceModel.Description;

using IFruitSvc;

using FruitSvc;

namespace WcfInstanceHost

{

class Program

{

staticvoid Main(string[] args)

{

using (ServiceHost host =new ServiceHost(typeof(FruitService),

new Uri("net.tcp://localhost:8000")))

{

ServiceEndpoint sed= host.AddServiceEndpoint(typeof(IFruitService), new NetTcpBinding(), "FruitService");

//设置IFruitService的ServiceContract特性的SessionMode

sed.Contract.SessionMode = SessionMode.Allowed;

ServiceMetadataBehavior behavior =new ServiceMetadataBehavior();

host.Description.Behaviors.Add(behavior);

ServiceBehaviorAttribute behaviorAttr = host.Description.Behaviors.FindServiceBehaviorAttribute();

if (behaviorAttr ==null)

{

behaviorAttr =new ServiceBehaviorAttribute();

}

//设置服务类FruitService的ServiceBehavior特性的ConcurrencyMode和InstanceContextMode

behaviorAttr.ConcurrencyMode = ConcurrencyMode.Single;

behaviorAttr.InstanceContextMode = InstanceContextMode.PerCall;

host.AddServiceEndpoint(typeof(IMetadataExchange),

MetadataExchangeBindings.CreateMexTcpBinding(), "mex");

host.Open();

Console.WriteLine("Fruit Service Is Running...");

Console.ReadLine();

}

}

}

}

运行此控制台程序,用如下命令生成代理和配置文件

“/a”是为了生存异步调用方法。而后把生存的两个文件添加到客户端项目内。

客户端调用代码:

using System;

using System.Threading;

namespace WcfInstanceClient

{

class Program

{

staticvoid Main(string[] args)

{

FruitServiceClient proxy =new FruitServiceClient();

for (int i =0; i 4; i++)

{

Console.WriteLine("{0}: Begin Calling GetFruitName", DateTime.Now.Ticks);

proxy.BeginGetFruitName(GetFruitNameCallBack, proxy);

}

Console.ReadLine();

}

staticvoid GetFruitNameCallBack(IAsyncResult ar)

{

string name = ((FruitServiceClient)ar.AsyncState).EndGetFruitName(ar);

Console.WriteLine("{0}: End FruitName:{1} ", DateTime.Now.Ticks, name);

}

}

}

首先设置ConcurrencyMode.Single和InstanceContextMode.PerCall 这种组合设置会为每次调用生成一个服务类实例。

运行结果:

下面用ConcurrencyMode.Single和InstanceContextMode.PerSession测试下,结果应该是每个客户会话一个服务类实例,这次启动两个客户端,应该只有两个服务类实例。

执行结果,服务端:

客户端:

下面我们用ConcurrencyMode.Multiple和InstanceContextMode.PerSession进行测试,因为同一会话中允许多个线程并发访问,所以需要手工控制访问的安全性。

修改服务类代码如下:

publicclass FruitService:IFruitService

{

//添加一对象,对此对象访问加锁

object lockObj =newobject();

privateint n =0;

FruitService()

{

Console.WriteLine("{0} : Created new instance of FruitService on thread", DateTime.Now.Ticks);

}

publicstring GetFruitName()

{

string name ="banana";

Console.WriteLine("{0} : GetFruitName called on thread {1} ", DateTime.Now.Ticks,

Thread.CurrentThread.ManagedThreadId);

lock (lockObj)

{

name=name +"_"+ (++n).ToString();

}

return name;

}

}

程序的执行结果(还是运行两个客户端)服务端:

客户端:

假如把InstanceContextMode设置为PerCall那将都会是1。还有几种组合就不一一测试。

WCF传输慢,这是为什么?拜托各位大神

检测一下网络传输量和传输速度。如果是传输量太大,服务端和客户端都是.net程序时,可以将ILISTT先用BinaryFormatter进行二进制序列化为BYTE[],并采用tcp传输模式进行传输,还是很慢的话可以考虑传输之前对字节流进行压缩,然后接收端接收后解压缩再BinaryFormatter反序列化。

结语:以上就是首席CTO笔记为大家整理的关于wcf传输最大数据量是多少的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于wcf传输最大数据量是多少的相关内容别忘了在本站进行查找喔。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/BigData/23958.html