我现在正在写一些奇怪的代码,我一直在想是否可以使用attributes
来修改WCF操作的行为,比如让它执行额外的检查或跳过一些逻辑。
例如,如果我们有以下请求信封:
[MessageContract]
public class UserRequest
{
[MessageBodyMember]
public string SessionKey { get; set; }
[MessageBodyMember]
public UserModel User { get; set; }
}
以及以下服务操作:
[ForceSession]
void AddUser ( UserRequest request )
{
}
void EditUser ( UserRequest request )
{
}
我们可以在AddUser
操作上有一些自动功能,它检查请求的会话密钥是否存在于当前的HttpContext
中。也许是类似于检查HttpContext.Current.Session[request.SessionKey] != null
的东西,它要么拒绝调用(发送一个空的响应信封),要么处理它。
当然,我可以在每个操作的开始添加检查代码,但是这会很快变得非常重复,特别是当我处理很多操作时。
我应该如何着手实施这类事情呢?
3条答案
按热度按时间mu0hgdu01#
WCF服务在本地使用属性,只检查类,如:
MessageContractAttriubte
、MessageHeaderAttriubte
、MessageBodyMemberAttribute
WebGetAttribute
、WebInvokeAttribute
ServiceBehaviorAttribute
、OperationBehaviorAttribute
、CallbackBehaviorAttriubte
ServiceKnownTypeAttribute
,x1米11英寸1xDataContractFormatAttribute
、XmlSerializerFormatAttribute
TransactionFlowAttribute
、DeliveryRequirementsAttribute
AspNetCompatibilityRequirementsAttribute
这些属性影响WCF处理,但WCF也提供了具有多个注入点的大型可扩展性模型,您可以通过在自定义属性中实现任何这些接口来添加自己的处理:
IServiceBehavior
-影响整个服务IEndpointBehavior
-影响单个端点IOperationBehavior
-影响单个操作IContractBehavior
-影响单个服务或数据合同这些行为可以包含一些逻辑或添加一些其他更高级的自定义功能,如:
IParameterInspector
-例如操作的自定义参数验证IDispatchMessageFormater
-处理服务器端的序列化和反序列化IClientMessageFormater
-处理客户端的序列化和反序列化IDispatchMessageInspector
-服务器端的消息修改或验证IClientMessageInspector
-在客户端修改或验证消息IDispatchOperationSelector
-选择在服务器端处理传入消息的操作IClientOperationSelector
-基于代理方法调用,可以选择从客户端调用不同的操作IOperationInvoker
-调用操作-允许使用操作参数,例如添加未在消息中传递但存储在本地的其他参数IErrorHandler
-全局错误处理IInstanceContextProvider
-自定义示例上下文处理-在WCF中实现自定义会话处理的基础IInstanceProvider
-自定义服务示例生存期处理正如你所看到的,WCF的可扩展性是相当大的--恕我直言,ASP.NET MVC是整个.NET框架中最好的(至少在我经常使用的部分中)。此外,自定义行为只是WCF可扩展性的一部分。第二部分处理自定义绑定和通道。
如果你想知道更多关于WCF可扩展性检查
但是这是你所需要的吗?首先检查现有的属性,如果它们已经为你提供了你正在寻找的功能。接下来想想会话- ASP.NET会话通常不提供给WCF服务。你必须打开AspNetCompatibility,之后你将把WCF服务降级为ASMX服务。即使在这之后,你也可能会遇到ASP.NET会话的问题。NET会话中,因为有关会话的信息是在cookie中传输的,而WCF默认情况下不使用它们。
最后,如果你只需要一些自定义属性来为选定的方法添加逻辑,它看起来更像是AoP(面向方面编程)的场景,可以通过几个IoC(控制反转)容器(如MS Unity,温莎Castle或Spring .NET)在WCF之外提供。
对于使用Unity的AoP,您可以查看Dino Esposito从MSDN杂志上发表的几篇文章:
对于Spring.NET,只需检查他们的excellent documentation。我没有使用温莎的AoP,但你会在互联网上找到很多文章。PostSharp是唯一提到的商业工具。它有一个免费版本,功能集较小,但你可以发现你需要的功能只有商业版本。
jdg4fx2g2#
是,需要创建实现IOperationBehavior和Attribute的自定义操作行为。
IOperationBehavior要求您实现4个方法。
1.验证()
您将完全控制通信的每一部分。您可以使用参数和消息检查器进行更精确的控制。
请参阅:IOperationBehavior Interface了解更多信息。
kx5bkwkv3#
如果在每个服务操作之前都需要检查安全性或授权类型,那么您可能需要实现自定义System.ServiceModel.ServiceAuthorizationManager
对于一般的行为,您可以添加自定义IEndpointBehavior或IOperationBehavior扩展。
如果你真的想控制一切,你可以实现一个自定义的
IServiceInvokerExtension
,在其中你可以检查被调用的方法的自定义属性,并在实际的服务方法调用之前/之后调用自定义方法(就像一个假的AOP)。