学习WCF相关知识,写一段WCF的小代码,客户端调用本地写好的WCF时提示:"操作超时",也按照网上的说法修改.
如:
1、首先保证客户端每次建立的连接在使用完成后进行关闭.即调用Close方法,否则此连接会在设置的会话后才自动关闭(该自动响应时间一般为10分钟,InactivityTimeOut属性),期间任何客户端也无法使用此服务.
2、可以增加默认连接连接数.配置文件如下:< serviceThrottling maxConcurrentCalls="20" maxConcurrentSessions="20" maxConcurrentInstances="30" />
说明:maxConcurrentCalls :最大并发数,默认为16;maxConcurrentSessions :最大的会话数,主要针对于PerSession的情况,默认为10;maxConcurrentInstances:最大实例数,默认为26
但真的解决不了问题.搞了半天总算找到了真正的原因.
下面小程序代码如下:
先在“引用”添加引用 System.ServiceModel;
类库 Iservice 中接口文件:ifly.cs
1 using System.ServiceModel; 2 3 namespace Iservice 4 { 5 [ServiceContract] 6 public interface ifly 7 { 8 [OperationContract] 9 string peofly(string name); 10 } 11 }
类库 service 中类文件:fly.cs
1 using System.ServiceModel; 2 using Iservice; 3 4 namespace service 5 { 6 public class fly:ifly 7 { 8 public string peofly(string name) 9 { 10 return "name:" + name; 11 } 12 } 13 }
控制台应用程序 host 中Program.cs
1 using System.ServiceModel; 2 using Iservice; 3 using service; 4 5 namespace host 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 using(ServiceHost host=new ServiceHost(typeof(service.fly))) 12 { 13 host.Open(); 14 Console.WriteLine("Start..."); 15 Console.Read(); 16 host.Close();//这一步运行不到吧!!! 17 } 18 } 19 } 20 }
在控制台应用程序 host 中添加 配置文件 App.config
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <system.serviceModel> 4 5 <services> 6 <!--service 类库命名空间,fly 类名--> 7 <service name="service.fly" behaviorConfiguration="MessageBehavior"> 8 <host> 9 <baseAddresses> 10 <add baseAddress="http://localhost:1111/a"/> 11 </baseAddresses> 12 </host> 13 <!--Iservice 类库命名空间,ifly 接口名--> 14 <!--wsHttpBinding,这个binding可以认为是webservice的加强版WSE,设计的目的就是用于异构系统的交互(比如java)--> 15 <endpoint address="" binding="wsHttpBinding" contract="Iservice.ifly"></endpoint> 16 </service> 17 </services> 18 <behaviors> 19 <serviceBehaviors> 20 <behavior name="MessageBehavior"> 21 <serviceMetadata httpGetEnabled="true"/> 22 <serviceDebug includeExceptionDetailInFaults="true"/> 23 <!--这一行没用--> 24 <!--<serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="1000" maxConcurrentInstances="50000"/>--> 25 </behavior> 26 </serviceBehaviors> 27 </behaviors> 28 </system.serviceModel> 29 </configuration>
生成之后 在 host\bin\Debug文件夹下 用“管理员权限”打开host.exe
右键=>添加服务引用=>输入地址 http://localhost:1111/a,修改命名空间为 sr
test的Program.cs添加代码:
1 namespace test 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 sr.iflyClient si = new sr.iflyClient(); 8 9 Console.Write(si.peofly("ls")); 10 Console.Read(); 11 } 12 } 13 }
将test设为启动项
Ctrl+F5运行:
控制台弹出:name:ls
运行正常。
开始的时候之所以提示 "操作超时",与我添加服务的方式有关:
开始时添加服务方式:
右键=>添加服务引用=>右下角“高级”=>右下角“添加Web引用”=>输入地址 http://localhost:1111/a,修改命名空间为 sr
再在test的Program.cs添加代码:
1 namespace test 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 sr.fly si = new sr.fly(); 8 9 Console.Write(si.peofly("ls")); 10 Console.Read(); 11 } 12 } 13 }
这样就会出现标题的错误.
在这里,引用之后发现两个不同之处,我想应该就是错误原因:
1:没看到什么区别。。。。。。很纠结。。。。。。
正确:
1 sr.iflyClient si = new sr.iflyClient();
错误:
1 sr.fly si = new sr.fly();
2.
正确的添加后是 Service References
错误的添加后是 Web References
如图:
难道本机写的WCF在本机发布 不能使用 高级 引用菜单。实验了一下引用网上的WCF服务,果然如此,网上发布的免费WCF,只能在 高级 引用菜单里引用才能正确调用。