用于asp.net MVC Web服务的常用操作过滤器或HttpModule

时间:2012-12-19 19:40:40

标签: asp.net-mvc web-services httpmodule action-filter

我们有一个用MVC 1.0编写的Web服务。需要拦截对此服务的每个请求。在这种情况下,开发一个HTTPModule是明智的,它拦截每个请求并在它到达代码之前修改方法参数,或者我应该创建动作过滤器并将属性放在每个方法上?我的第一个猜测是然后用动作过滤器属性标记每个方法,我应该创建一个httpModule,这将最小化工作量和代码。

实施例

  
      
  1. 客户端调用“servicename / action / username”
  2.   
  3. 服务器在HTTPModule中拦截此请求,解码用户名
  4.   
  5. 将解码用户名传递给操作。
  6.   

你们有其他建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用继承自Route的自定义路由来解决此问题。类似的东西:

public class UserNameRoute : Route
{
    public override RouteData GetRouteData(HttpContextBase httpContext) {
        var routeData = base.GetRouteData(httpContext);

        // Not sure if you need to set routeData.Values["username"] too
        // to make sure the route catches on
        routeData.DataTokens["username"] = DecodeUserName(routeData.Values);

        return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) {

        values["username"] = EncodeUserName(requestContext.RouteData.DataTokens);

        return base.GetVirtualPath(requestContext, values);
    }
}

然后你“只”必须实现DecodeUserName和EncodeUserName。