Ric*_*gan 3 .net wcf attributes
我现在正在研究一些时髦的代码,我一直想知道我是否可以attributes用来修改WCF操作的行为,比如可能让它执行额外的检查或者让它跳过一些逻辑.
例如,如果我们有以下请求信封:
[MessageContract]
public class UserRequest
{
[MessageBodyMember]
public string SessionKey { get; set; }
[MessageBodyMember]
public UserModel User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及以下服务操作:
[ForceSession]
void AddUser ( UserRequest request )
{
}
void EditUser ( UserRequest request )
{
}
Run Code Online (Sandbox Code Playgroud)
我们可以在AddUser操作上有一些自动功能,检查请求的会话密钥是否存在于当前HttpContext.也许相当于检查的东西HttpContext.Current.Session[request.SessionKey] != null,它要么拒绝呼叫(发送一个空的响应信封),要么处理它.
当然,我可以在每个操作开始时添加检查代码,但这可以非常快速地重复,特别是如果我正在处理大量操作.
我应该如何实施某种类型的东西?
WCF服务本身使用属性只检查类,如:
ServiceContractAttribute, OperationContractAttributeMessageContractAttriubte,MessageHeaderAttriubte,MessageBodyMemberAttributeWebGetAttribute, WebInvokeAttributeServiceBehaviorAttribute,OperationBehaviorAttribute,CallbackBehaviorAttriubteServiceKnownTypeAttribute, FaultContractAttriubteDataContractFormatAttribute, XmlSerializerFormatAttribute TransactionFlowAttribute, DeliveryRequirementsAttributeAspNetCompatibilityRequirementsAttribute 这些属性会影响WCF处理,但WCF还提供了具有多个注入点的大型可扩展性模型,您可以通过在自定义属性中实现任何这些接口来添加自己的处理:
IServiceBehavior - 影响整个服务IEndpointBehavior - 影响单个端点IOperationBehavior - 影响单一操作IContractBehavior - 影响单一服务或数据合同这些行为可以包含一些逻辑或添加一些其他更高级的自定义功能,如:
IParameterInspector - 例如,操作的自定义参数验证IDispatchMessageFormater - 处理服务器端的序列化和反序列化IClientMessageFormater - 在客户端处理序列化和反序列化IDispatchMessageInspector - 服务器端的消息修改或验证IClientMessageInspector - 客户端的消息修改或验证IDispatchOperationSelector - 选择在服务器端处理传入消息的操作IClientOperationSelector - 基于调用的代理方法可以选择从客户端调用的不同操作IOperationInvoker - 调用操作 - 允许使用操作参数,例如添加未在消息中传递但在本地存储的其他参数IErrorHandler - 全局错误处理IInstanceContextProvider - 自定义实例上下文处理 - 如果要在WCF中实现自定义会话处理的基础IInstanceProvider - 自定义服务实例生存期处理 正如您所看到的,WCF的可扩展性非常大 - 使用ASP.NET MVC的IMHO在整个.NET框架中是最好的(至少在我经常使用的部分中).此外,自定义行为只是WCF可扩展性的一部分.第二部分涉及自定义绑定和通道.
如果您想了解有关WCF可扩展性检查的更多信息
但这是你需要的吗?首先检查现有属性,如果他们已经为您提供了您正在寻找的功能.接下来考虑会话 - 通常不向WCF服务提供ASP.NET会话.您必须打开AspNetCompatibility,然后您将WCF服务降级为ASMX服务.即使在此之后,您可能会遇到ASP.NET会话问题,因为有关会话的信息是在cookie中传输的,默认情况下WCF不会使用它们.
最后,如果你只需要一些自定义属性来为所选方法添加逻辑,那么它更像是AoP(面向方面编程)的场景,它可以通过几个IoC(控制反转)容器(如MS Unity,Windsor Castle或Spring.NET.另一个选择是纯AoP框架 - PostSharp.
对于AoP with Unity,您可以查看MSDN杂志的Dino Esposito撰写的几篇文章:
对于Spring.NET,只需查看他们的优秀文档.我没有在温莎使用AoP,但你会在网上找到很多文章.PostSharp是唯一提到的商业广告工具.它有一个功能较小的免费版本,但你可以发现你需要的功能只有商业版本.
| 归档时间: |
|
| 查看次数: |
1322 次 |
| 最近记录: |