WCF服务编程设计规范(8):服务托管、自托管代码、客户端代理管理

简介:
本节是翻译整理的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 服务,避免XmlSerializer XML 序列化器)和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


 本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/320878 ,如需转载请自行联系原作者
相关文章
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
11月前
|
Windows
WCF服务端调用客户端.
WCF服务端调用客户端.
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
60 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
91 0
|
C++
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
122 0
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
|
监控
Wcf通讯基础框架方案(三)——客户端
假设定义了一个服务契约: [ServiceContract(Namespace = "WcfExtension.Services.Interface")] public interface ITestService { [OperationContract] ...
707 0
|
安全 网络架构
消息(7)——WCF编程模型中控制消息(1)绑定,契约
WCF服务要通过终结点来进行通信,终结点三大构成元素:ABC,其中的B,binding是重中之重,它解决了在消息交换过程中的编码,传输协议,安全等问题。 绑定是分层的,一个绑定对象对应一组有序的绑定元素的集合。
760 0
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
877 0
|
Windows
WCF服务寄宿到IIS
一.WCF简介: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
1079 0