WCF客户端调用时提示"操作超时"

 

学习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


在客户端 控制台应用程序中 test 引用服务

右键=>添加服务引用=>输入地址 http://localhost:1111/a,修改命名空间为 sr

WCF客户端调用时提示"操作超时"_第1张图片

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

WCF客户端调用时提示"操作超时"_第2张图片

运行正常。

开始的时候之所以提示 "操作超时",与我添加服务的方式有关:

开始时添加服务方式:

右键=>添加服务引用=>右下角“高级”=>右下角“添加Web引用”=>输入地址 http://localhost:1111/a,修改命名空间为 sr

 WCF客户端调用时提示"操作超时"_第3张图片

再在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客户端调用时提示"操作超时"_第4张图片

 

 难道本机写的WCF在本机发布 不能使用 高级 引用菜单。实验了一下引用网上的WCF服务,果然如此,网上发布的免费WCF,只能在 高级 引用菜单里引用才能正确调用。 

 

 

 

 

你可能感兴趣的:(WCF)