[WCF学习笔记] 我的WCF之旅(1):创建一个简单的WCF程序

时间:2023-03-12 14:08:14

近日学习WCF,找了很多资料,终于找到了Artech这个不错的系列。希望能从中有所收获。

本文用于记录在学习和实践WCF过程中遇到的各种基础问题以及解决方法,以供日后回顾翻阅。可能这些问题都很基础,可是对于新手来说,在没有经验的情况下有时候很难找到解决办法。反正这些问题是真的困扰了我一些时间的。若能为其他新手所用,也是我的荣幸。

博文系列地址:《我的WCF之旅》博文系列汇总

我的WCF之旅(1):创建一个简单的WCF程序

1. 照葫芦画瓢的把第一个简单的WCF程序做出来运行之后(设置Hosting项目作为启动项),在执行到“host.Open();”处遇到如下错误

HTTP 无法注册 URL http://+:3721/calculatorservice/。进程不具有此命名空间的访问权限(有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=70353)。”

因为之前看过其他文章时有所提及,大概猜到如何解决:使用管理员身份运行Visual Studio即可。至于原因,没有深究。

 

2. WCF Service Configuration Editor添加Service的时候怎么选择Service Type?

本来是比较喜欢用手敲的,但是第一次见这个Tool,想玩一下,结果新建Service的时候懵了,要选Service Type!

还记得使用代码实现配置里面有这么一段吗?ServiceHost host = new ServiceHost(typeof(CalculatorService))

没错,Service Type就是我们自定义的服务的实现类型,不过是要指定完全限定名称,如示例中的Artech.WcfServices.Services.CalculatorService,应用到配置文件中即为Service元素的name属性,即<service name="Artech.WcfServices.Services.CalculatorService">

选完之后还没完,又要选Contract Type of Endpoint,跟上面一样的方法,在代码中可以看出,不再赘述。

接下来还有其他各种选择和设置,配置完后,我决定再也不用这个Tool了,简直是浪费时间和精力,好痛苦,哈哈,还是老老实实手敲吧。

 

3. 如何添加服务引用?运行Hosting.exe报错?

在步骤五(创建客户端调用服务)中提到:在运行服务寄宿程序(Hosting.exe)的情况下,右键点击Client项目,在弹出的上下文菜单中选择“添加服务引用(Add Service References)”。

请注意此处说的运行Hosting.exe,所以不是Debug模式哦,Debug模式下是无法对项目进行添加服务引用操作的。正确的做法是到Hosting项目所在物理路径的Bin/Debug或者Bin/Release文件夹找到编译之后生成的Hosting.exe, 并使用管理员身份运行(特别提示:不使用管理员身份运行会报错哦)。

 

4. IIS寄宿之后通过URL访问报错:HTTP 错误 500.19 - Internal Server Error

配置错误 :由于权限不足而无法读取配置文件

[WCF学习笔记] 我的WCF之旅(1):创建一个简单的WCF程序

解决办法:给虚拟目录添加IIS_IUSRS的权限

 

5. IIS寄宿后通过URL访问报错

找不到类型“WcfServices.Services.CalculatorService”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供。

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.InvalidOperationException: 找不到类型“WcfServices.Services.CalculatorService”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供。

解决方法:把Services.dll和Contracts.dll从Bin/Debug|Release目录拷贝到Bin目录,或者在项目Build选项中把Output path设置改为Bin\再重新编译。这个老师在文章里有提到,但是没有说明会报的错误是什么,如果不小心疏忽掉,从这个错误消息中不太容易判断是什么造成的。

 

其他大大小小的问题,还有一些忘记记录。至此,花了不少时间做这个练习,总算把它完成了。看来路还很长啊。

 

TT