您的位置:首页 > 其它

WCF服务IIS7.5寄宿时遇到的问题

2013-02-21 15:12 465 查看
一、错误页面如下,出现这个问题,很大的可能是在iis中没有正确的配置WCF服务,解决的办法也很简单
使用 %Windows%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation目录下的ServiceModelReg.exe程序就好了

首先检测服务状态:
命令: ServiceModelReg -vi
结果: 如果协议都是“未安装”状态 则可以确定是WCF在IIS中没有正确安装

接着安装服务:
命令: ServiceModelReg -i
结果: 如果成功安装,会返回成功信息

再试试服务,应该就可以正常使用了

二、今天在测试网站的时候,在浏览器中输入http://localhost/时,发生如下错误:

HTTP Error 500.21 - Internal Server Error

Handler "WebServiceHandlerFactory-Integrated" has a bad module "ManagedPipelineHandler" in its module list.

在网上找了一下原因,结果是

原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装

解决:开始->所有程序->附件->鼠标右键点击“命令提示符”->以管理员身份运行->%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe –i

三、WCF Service重命名之后,在客户端就会出现服务类型找不到的错误。要分析解决这个问题,我们就要从svc、config和code文件之间的关系入手来分析。。。

新添加一个WCF Service项,命名为OrderService.svc,然后把svc的文件名改成其他的名字,比如OrderProcessorService.svc。编译通过之后,试图从客户端访问这个service的时候,就会报错说找不到这个服务类型,如下:

The type 'WcfSrvDemo4.OrderService', provided as the Service attribute value in the ServiceHost directive, or provided in the configuration element system.serviceModel/serviceHostingEnvironment/serviceActivations could not be found.

解决这个问题的方法很简单,但是原因我们要做详细说明。

首先,打开svc文件,你会发现只有一行像这样的内容:<%@ ServiceHost Language="C#" Debug="true" Service="WcfSrvDemo4.OrderService" CodeBehind="OrderProcessorService.svc.cs" %>。这里有两个重要参数,Service和CodeBehind。编辑状态下,CodeBehind一般不会出错,因为当你修改svc文件的时候,这里会自动更新;但是Service只有在利用重构的方法修改Service类名的的时候才会被更新到,利用其它方法修改类名,这里就会保留原值,所以这里往往是容易出错的地方。

其次,在运行时,宿主程序从svc文件中的Service属性得到WCF Service的完全限定名,然后从配置文件中找到同名的service,进而找到所有的EndPoint,并根据其属性进行实例化。如果svc文件中的Service属性和配置文件中的Service名字匹配,就无法找到EndPoint以及它的配置信息。

最后,配置文件中的Service名字必须是Service类名的完全限定名(即Namespace.classname),EndPoint的Contract必须是Service接口的完全限定名。否则,程序就无法从程序集中找到相应的类进行加载。

明白了svc、config和code文件之间的关系之后,就会很容易在错误出现的时候,很快锁定错误的范围进而解决问题。

注:本人遇到的第三个问题不是上面的问题,而是因为创建了虚拟目录的方式添加网站,当添加运用程序后可以正确访问元数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: