0

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

例子

  1. 客户端调用“服务名/操作/用户名”
  2. 服务器在 HTTPModule 中拦截这个请求,解码用户名
  3. 解码用户名被传递给动作。

大家还有什么建议吗?

4

1 回答 1

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。

于 2012-12-19T19:52:59.420 回答