WCF服务编程设计规范(8):服务托管、自托管代码、客户端代理类、客户端代理管理、客户端异常管理、数据契约、SOAP与REST

来源:互联网 发布:夫妻相测试软件 编辑:程序博客网 时间:2024/04/30 20:16

Posted on 2010-05-07 00:14 Frank Xu Lei 阅读(793) 评论(12)  编辑 收藏 所属分类: SOA and EAI, WCF服务编程设计规范

  本节是翻译整理的WCF服务编程设计规范(8),内容主要包括:服务托管、自托管代码、客户端代理类、客户端代理管理、客户端异常管理、数据契约、SOAP与REST。如何选择托管类型?,如何管理客户端代理?如何处理客户端异常?如何选择数据契约?如何选择SOAP与REST服务?给出了选择标准。

Service Hosting

服务托管

Favor WAS Hosting when Server 2008 is an option

可以使用Server2008的时候,推荐使用WAS

Ø Multiple protocol support IIS Hosting model and tools

多协议支持IIS托管模型和工具

Favor IIS for external HTTP only services

对外开放的http服务推荐使用IIS

Ø Better on-box scalability / availability through worker

通过工作线程能获得更好的扩展性/可用性

Ø process model

处理模型

Ø Better management tools

更好的管理工具

Favor self-hosting for stateful services, callbacks, .NET Service Bus, debugging

状态服务、回调、.NET Service Bus和调试推荐自托管

Have a console-based debug self-host for development time

开发时使用Console控制台托管

Ø Can be a Windows Service project that is used for production self-hosting with a mode switch for debugging

可以用于产品阶段托管在Windows服务的项目类型,利于模型转换与调试

Consider Dublin hosting in the future

将来考虑Dulbin托管(Windows Application Server

Self Host Code

自托管代码

Do not put ServiceHost in a using statement in production code

不要是在产品的Using代码块里使用ServiceHost

Ø Dispose can throw an exception that masks the real

Dispose可以跑出掩盖事实的异常

Ø Exception thrown from Open call

开放调用跑出的异常

Ø Explicitly call Close in try/catch, log/ deal with exception in catch

try/catch里明确调用Close方法,在Catch代码里Log并处理异常

Client Proxy Classes

客户端代理类

Favor static proxy class over ChannelFactory

ChannelFactory上推荐静态代理类

Ø Connection caching in the base class in 3.5

WCF3.5在基类里支持连接缓存机制

Ø Place for encapsulation of common patterns

封装常用模式的地方

Hand-code or micro-code generate proxy classes for internal services

为内部服务手动编写代码或者微代码 生成代理类

Ø Less bloated code

避免臃肿的代码

Ø Share service contract and data contracts through libraries

通过类库共享服务和数据契约

Ø Explicit control over config file

通过配置文件明确控制

Add Service Reference for external services or when you want an async API on the client

为外部服务添加服务引用或者当你想在客户端使用异步API的时候

Ø Clean up config after it destroys it

当你销毁它的时候,清楚配置

Ø Make sure to add references to data contract libraries before adding the service reference to avoid duplicate definitions

在引用服务之前确保引用数据契约类库,避免代码重复

Ø Live with the duplicate service contract definition instead of needing to repeatedly clean up the proxy code

使用复制的服务契约定义来代替重复的清理代理代码的工作

Client Proxy Management

客户端代理管理

Cache client proxies if frequent calls to avoid session establishment cost

如果调用频繁,使用代理缓存,避免建立会话代价

Ø If secure / reliable session enabled

如果启用安全/可靠的会话

Ø Have to deal more cautiously with faulted proxies

特别注意处理错误的客户端代理

Check proxy state before using

使用之前检查代理的状态

Get rid of proxy after exception

异常以后清除代理

Don’t put proxies in a using statement

不要把代理放到一个using代码块中

Ø Dispose call might throw exception and mask real exception

销毁调用可能抛出异常并掩盖真实的异常

Ø Explicitly close in a try/catch block, and if Close throws an exception, abort the proxy to ensure resource clean up

try/catch块里,清晰地关闭,并且,如果close的时候抛出异常,终止代理确保资源释放

Client Exception Management

客户端异常管理

All exceptions thrown from a service call derive from CommunicationException

所有的调用服务的异常都继承自CommunicationException

FaultException could be wrapped unhandled exception on the client, or explicit error returned from the service

FaultException可以被包装在一个客户端的未处理异常中,或者明确返回自服务

FaultException<T> always an explicit error returned from the service

FaultException<T>始终明确从服务返回的错误

Simple approach:

简单的方法

Ø Any exception from a proxy call, safe close the proxy

代理调用时发生任何异常,都要安全地关闭代理

Advanced approach:

高级方法

Ø FaultException<T> - proxy is reusable

FaultException<T>-代理是可以复用的

Data Contracts

数据契约

Favor data contracts over serializable types

推荐使用可序列化类型作为数据契约

Ø More explicit model, better control over what the client sees

更清晰的模型,对于客户端说看到的数据进行更好的控制

Implement IExtensibleDataObject

实现IExtensibleDataObject接口

Ø Avoids dropping data that the service / client does not understand

避免使用服务/客户端都不明白的数据

Avoid passing complex .NET specific types for interoperable services

避免在互操作服务里传递复杂的.NET类型

Ø DataSets and Exception types

DataSets Exception类型

Avoid XmlSerializer and MessageContracts except for interoperable scenarios and REST services

除了互操作的场景和REST服务,避免XmlSerializerXML序列化器)和MessageContracts(消息契约)

SOAP vs. REST

SOAPREST

Favor SOAP services when you are writing a service that only your code will consume

当你编写的服务只有你自己使用时,推荐SOAP

Favor REST services for publicly exposed, data oriented services

当你的服务是公开暴露、面向数据时,推荐使用REST

 

 


 

【老徐的博客】
【作      者】:Frank Xu Lei
【地      址】:

http://www.cnblogs.com/frank_xl/
【中文论坛】:微软WCF中文技术论坛
【英文论坛】:微软WCF英文技术论坛

 

原创粉丝点击