MVC 4 WebAPI json数组劫持

rgr*_*per 3 jquery json asp.net-web-api

我有一个方法看起来像这样的ApiConroller:

[HttpGet]
public IEnumerable<MyValue> Values()
{
     return db.MyValues.ToList();
}
Run Code Online (Sandbox Code Playgroud)

它返回一个JSON数组.我使用jQuery来获得结果.如何保持该阵列不被劫持,像自治一样,等等?

Fil*_*p W 8

您可以通用方式执行此操作.

添加以下类:

public class SecureJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
    public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        if ((typeof (IEnumerable).IsAssignableFrom(type)))
        {
            value = new {result = value};
        }
        return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在你的WebApiConfig JSonMediaTypeFormatter中用这个新的替换默认值:

    config.Formatters.RemoveAt(0);
    config.Formatters.Insert(0, new SecureJsonMediaTypeFormatter());
Run Code Online (Sandbox Code Playgroud)

现在你可以像你原来那样返回任何你想要的IEnumerable,即

[HttpGet]
public IEnumerable<MyValue> Values()
{
     return db.MyValues.ToList();
}
Run Code Online (Sandbox Code Playgroud)

并且SecureJsonMEdiaTypeFormatter将拦截它,并在result属性下包装一个匿名对象:

{
    "result": [
        {
            "name": "Toronto Maple Leafs",
            "league": "NHL"
        },
        {
            "name": "Montreal Canadiens",
            "league": "NHL"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)