【51CTO独家特稿】在以前的Silverlight应用程序中,我们都是通过给Web项目添加一个新的WCF服务,并填充代码的方式创建Windows通信基础(WCF)服务的,这种方法导致我在测试和调试我的服务配置时遇到了许多问题,有没有更好的方法来添加一个WCF服务?
创建WCF服务的方法很多,这里要介绍的方法会让你解决问题变得更容易,它利用Visual Studio 2010中提供的轻量级WCF配置选项。
向Silverlight应用程序添加一个服务最简单的方法是,向Silverlight解决方案的Web应用程序项目添加一个WCF服务项,当你添加一个名为TestServiceCB的服务时,Visual Studio会用相同的服务定义创建一个接口。
- [ServiceContract]
- public interface ITestServiceCB
- {
- [OperationContract]
- void DoWork();
- }
此外,Visual Studio会添加一个TestServiceCB.svc文件,其内容如下,它实现了服务接口:
- public class TestServiceCB : ITestServiceCB {
- public void DoWork() {
- }
- }
当你选中TestServiceCB.svc,并从上下文菜单中选择“在浏览器中查看”,浏览器会打开URL localhost:55778/TestServiceCB.svc,显示关于服务的一些信息,注意URL中的端口55778,在你的环境中可能会有所不同。
这个解决方案只适合简单的服务,对于涉及到业务和数据访问层的复杂服务可能需要集成和单元测试,使用不同的主机部署相同的服务也比Web应用程序更困难,对于这些情况,图2显示的项目结构可能会更好一点。
图1 WCF服务的一个独立服务库,允许你以多种方式托管它们并协助测试你的配置,
这不是Visual Studio的默认行为,但难度并不大
使用这种方法,所有用于实现服务的接口和类都被包含在一个单独的服务库项目里面,Web项目仍然托管服务,根据需要调用服务库中的类,创建一或多个测试项目直接测试服务库中的类,从而减少出现问题的可能性,给你提供了一个绕过客户端进行调试的方法,在Silverlight和WCF世界中这一点特别重要,因为默认情况下,服务返回的所有异常都只提供了很少甚至没有提供诊断信息。
如果要创建这个结构,首先给你的Silverlight解决方案添加一个WCF服务库,默认情况下,Visual Studio会给你的服务库项目添加一个名为IService1.cs的接口和名为Service1.cs的服务类,它们和你直接在Web应用程序中添加WCF服务时创建的接口和代码隐藏类相似,你应该修改接口和服务类的名字,反映出你的服务名,作为一个例子,一个叫TestService的服务可能包含以下ITestService接口:
- [ServiceContract]
- public interface ITestService
- {
- [OperationContract]
- DateInformation GetFutureDate(ref ServiceContext context,
- int futureDays);
- }
和一个对应的实现服务的服务类:
- public class TestService : ITestService {
- public DateInformation GetFutureDate(
- ref ServiceContext context, int futureDays) {
- return null;
- }
- }
为了在SIlverlight应用程序对应的Web应用程序中托管你的服务,你需要添加一个到服务库项目的引用,并创建一个名为TestService.svc的文件,你必须首先以文本格式添加这个文件,然后修改前缀,给TestService.svc文件增加下面的标记:
- <%@ ServiceHost Language="C#" Debug="true" Service = "MyTest-
- Service.TestService" %>
你还需要在Web应用程序的Web.config文件中配置你的服务,WCF团队在Microsoft .NET Framework 4中做了很大努力,通过使用绑定的默认值减少了WCF配置的复杂性,这意味着你不用自己添加任何配置信息,但对开发而言,有些配置覆盖掉可能更好,将下面的内容添加到你的Web.config文件中:
- <system.serviceModel>
- <behaviors>
- <serviceBehaviors>
- <behavior>
- <serviceMetadata httpGetEnabled="true"/>
- <serviceDebug includeExceptionDetailInFaults="false"/>
- </behavior>
- </serviceBehaviors>
- </behaviors>
- <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
- </system.serviceModel>
服务Metadata标签告诉WCF发布当你向Silverlight应用程序添加一个服务引用时使用到的元数据,在你的本地机器上,Visual Studio会自动为你的服务分配一个地址,但在部署到生产环境时,你需要添加额外的配置信息指定服务的真实URL,注意Visual Studio会在服务库项目的App.config文件中创建一个配置小节,但WCF会忽略该配置信息。
测试服务配置
现在你可以测试你的服务,首先测试你的配置文件设置是否正确,在解决方案资源管理器中选中SVC文件,点击右键,在弹出的菜单中选择“在浏览器中查看”,浏览器将会显示关于服务的一些信息,注意自动生成的URL。
为了测试你的服务是否可以真正调用,Visual Studio提供了WCF测试客户端工具,打开Visual Studio命令行窗口,在命令提示符后输入命令wcftestclient,弹出该客户端窗口后,选择“文件”*“添加服务”选择要测试的服务,然后输入浏览器中显示的URL,从测试客户端,你可以结合数据调用每一个服务方法,并查看结果,WCF测试客户端如图2所示。
图2 WCF测试客户端提供了一个方法验证服务是否正确启动,
界面右侧的“请求”和“响应”区域提供了一个方法进行冒烟测试
至此,你已经为服务完成了服务端检查,你可以增加你认为合适的操作、业务和数据访问层以扩大你的服务,我总是会增加一个服务测试项目测试服务库,这种测试通常会获得更高回报,在通过Silverlight客户端应用程序诊断服务问题时,可以帮助我避免掉耗时且令人沮丧的问题。
原文名:Debug WCF Services in Silverlight Apps 黄永兵 译
原文出处:http://visualstudiomagazine.com/articles/2010/11/01/visual-studio-2010-tips-2.aspx
【编辑推荐】