jri*_*sta 5 json routes constraints bson asp.net-mvc-3
我正在使用ASP.NET MVC 3平台开发一些REST资源.到目前为止,它非常棒,我喜欢MVC 3的灵活性,使用它构建REST服务也是一件轻而易举的事.我遇到困难的一个领域是Global.asax中的路径限制.首先,他们似乎永远不会正常工作(包括一个ALWAYS返回404,即使输入肯定满足约束的要求......但这是另一个问题).
其次,更重要的是,当约束失败时返回的结果始终是HTML页面.假设约束有效,当这些REST服务的所有使用者都接受数据类型时,例如application/json,text/xml,可能是bson等,结果是HTML确实会引起混乱.我真的需要能够直接解决客户端的错误,而不是简单地将html用于边带解析.
是否可以更改响应路径约束而返回的内容?是否有可能使得返回动态,如果发出请求的客户端只接受application/bson,我们可以生成可接受的响应,而不是简单地生成单个mime类型的预设响应?
关于返回代码错误而不是转到控制器,您必须实现自定义 RouteHandler。此链接恢复了您可以点击的所有内容...并且您可以通过这种方式进行修改。关于“调整”返回类型......您可以在控制器中执行此操作。如果在某些情况下您返回 Json(...),而在其他情况下您返回 View 或 PartialView,则放置 som 就足够了。
然而,在控制器过滤器中执行此操作很好......!
我实现了一个控制过滤器,允许控制器与客户端协商返回类型。我很简单...客户端只需在路由参数(一段 url 或查询字符串)中声明我想要接收的类型,或者通过发布包含此信息的字段来声明。使用非常简单......如果没有来自客户端的信息,您的控制器可以返回“默认”返回类型的视图。然后,在调用视图之前,过滤器会自动“更改”结果类型,将其转换为客户端所需的类型。过滤器处理的可能性是一个视图,其名称由客户端或 Json 选择
代码在这里(其中包含一些对客户端提供的“提示”的控制,以防止恶意用户的攻击):
public class AcceptViewHintAttribute : ActionFilterAttribute
{
private JsonRequestBehavior jsBehavior;
public AcceptViewHintAttribute(JsonRequestBehavior jsBehavior = JsonRequestBehavior.DenyGet)
{
this.jsBehavior = jsBehavior;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
string hint = filterContext.RequestContext.HttpContext.Request.Params["ViewHint"];
if (hint == null) hint = filterContext.RequestContext.RouteData.Values["ViewHint"] as string;
if (!string.IsNullOrWhiteSpace(hint) && hint.Length<=100 && new Regex(@"^\w+$").IsMatch(hint) )
{
ViewResultBase res = filterContext.Result as ViewResultBase;
if (res != null)
{
if (hint == "json")
{
JsonResult jr = new JsonResult();
jr.Data = res.ViewData.Model;
jr.JsonRequestBehavior = jsBehavior;
filterContext.Result = jr;
}
else
{
res.ViewName = hint;
}
}
}
base.OnActionExecuted(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
713 次 |
| 最近记录: |