我们有一个用MVC 1.0编写的Web服务。需要拦截对此服务的每个请求。在这种情况下,开发一个HTTPModule是明智的,它拦截每个请求并在它到达代码之前修改方法参数,或者我应该创建动作过滤器并将属性放在每个方法上?我的第一个猜测是然后用动作过滤器属性标记每个方法,我应该创建一个httpModule,这将最小化工作量和代码。
实施例
- 客户端调用“servicename / action / username”
- 服务器在HTTPModule中拦截此请求,解码用户名
- 将解码用户名传递给操作。
醇>
你们有其他建议吗?
答案 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。