[ServiceContract] [XmlSerializerFormat] public interface IEtermavh { [OperationContract] System.Xml.XmlDocument GetXml(string type, string citys, string flydate, string flytime, string aircomp, out string error); } // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Etermavh”。 [ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)] public class Etermavh : IEtermavh { public System.Xml.XmlDocument GetXml(string type, string citys, string flydate, string flytime, string airComp, out string error) { Comm.log(string.Format("进入。。type:{0}", type), LogType.WcfLogin); error = null; System.Threading.Thread.Sleep(10000); } } //WCF服务
//客户端调用wcf服务,wcf服务已开启 protected void Page_Load(object sender, EventArgs e) { eterm.EtermavhClient client = new eterm.EtermavhClient(); string error; client.GetXml("", "", "", "", "", out error); }
客户端开多个页面去刷新调用wcf服务的方法,在日志里记录的:
2012/11/21 18:20:31 进入。。type:
2012/11/21 18:20:42 进入。。type:
2012/11/21 18:20:53 进入。。type:
2012/11/21 18:21:05 进入。。type:
是排着队....调用wcf方法的,怎么才能让各个调用在wcf服务端能并发处理?
在web中调用wcf服务,现在用控制台什么的就没这个问题,就是web调用才有这样的现象,在web中的不同页面调用也没这种现象,同时打开多个同一页面就阻塞了.....
异步也不行,也是上面的情况 string val; protected void Page_Load(object sender, EventArgs e) { Service1Client client = new Service1Client(); IAsyncResult result = client.BeginGetData(22, back, client); while (!result.IsCompleted) { } Response.Write(val); //eterm.EtermavhClient client = new eterm.EtermavhClient(); //string error; //client.GetXml("", "", "", "", "", out error); } private void back(IAsyncResult result) { Service1Client client = result.AsyncState as Service1Client; val = client.EndGetData(result); }
ServiceBehavior(InstancesContextMode=InstancesContextMode.PerCall
这个是默认值
不设置,就是这个值
你光是通过时间就能判断是一个一个的处理的?而不是并发?
我同时刷新多个页面(当然切换页面可能有个1,2秒),这些客户端页面都调用这个wcf服务的方法,生成的日志就是这样的.
这个wcf服务方法是一个耗时的操作,难道每次调用都是需要前一个处理完成才能处理下一个调用请求?这不是并发吧?
我觉得这应该是一个很简单的问题...但是没搞过wcf,wcf对并发这个应该很好的支持吧,不然就太失败了..,兄弟知道怎么搞不?
能把你配置信息发出来看下吗?
<system.serviceModel> <bindings> <netTcpBinding> <binding closeTimeout="00:05:00" sendTimeout="00:05:00"> </binding> </netTcpBinding> </bindings> <services> <service name="JBEwcf.Etermavh" behaviorConfiguration="CalculatorServiceBehavior"> <host> <baseAddresses > <add baseAddress="http://localhost:8864"/> </baseAddresses> </host> </service> </services> <!--定义CalculatorServiceBehavior的行为--> <behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> 服务端的 <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IEtermavh"/> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:8864/" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IEtermavh" contract="eterm.IEtermavh" name="BasicHttpBinding_IEtermavh"/> </client> </system.serviceModel>客户端的
@Rookier: 你是在同一个客户端发起连接?你试试在服务上添加 [ServiceBehavior(InstancesContextMode=InstancesContextMode.PerCall)]