Silverlight应用程序中添加WCF服务的兼容性问题
Silverlight商业应用程序为领域数据服务提供了一个极佳的模板,我们可以快速的建立Silverlight的数据应用。当然我们也可以在之上在添加WCF服务而附加其他的服务调用。不过近日我在使用这个方法时却出现了一个问题,同时发现在进行Silverlight网页调用WCF服务时会出现一点儿异常,这个异常不是那么容易发现的。在Visual Studio 调试时仅仅提示产生了运行时错误。如图所示:
没有任何可用的信息,所以也很难发现那儿出现了问题,经过再三的试验,才发现了问题的所在,还好微软为WCF服务调试提供了丰富的异常信息[这就是这个软件帝国永久不败的高明之处吧]。
现在来看一下具体的过程吧,首先新建一个Silverlight商业应用程序,接着我们来添加一个WCF服务。在不做任何更改的情况下,我们现在来调试这个工程,现在让你伤心的事情出现了:网页前端显示了上面的提示框。你的程序不能用。。。
不要着急,既然说到这儿,我们就先来看看WCF服务能否正常运行,在所添加的WCF服务(那个以.svc结束的文件)右键选择“在浏览器中查看”,在浏览器的信息中出现了如下的错误:
很显然,调试器认为你的服务无法激活,因为它不支持 ASP.NET 兼容性。微软为你生成了两个解决之道:
1、在 web.config 中关闭 ASP.NET 兼容性模式;
2、AspNetCompatibilityRequirements 特性添加到服务类型且同时将 RequirementsMode 设置为“Allowed”或“Required”。
如果你选择第一个方案,非常的不幸,单独的WCF服务调试没有任何的问题,不过整个应用程序还是会产生上面的异常。这是因为Silverlight是运行在ASP.NET 兼容模式下的。
正确的解决之道:
现在我们来使用第二个方案:
1、根据提示将Web.config中的 serviceHostingEnvironment 配置节中的 aspNetCompatibilityEnabled 设置成true,即启用兼容模式,这个配置节看起来就像下面这样:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
2、 接着我们还要在服务的类型中添加代码级的兼容性特性AspNetCompatibilityRequirementsAttribue,应用于服务实现类时,此特性可指示该服务是否需要 ASP.NET 兼容模式,
或是否支持为宿主应用程序域 (AppDomain) 启用该兼容模式:
AspNetCompatibilityRequirementsAttribue,并设置他的RequirementsMode为 AspNetCompatibilityRequirementsMode.Allowed
或Required之一来启用兼容模式。如下所示:
恭喜你现在我们能完全正常的使用这个WCF服务了。