什么是在ASP.NET上检测JSON请求的最佳方法

Dax*_*x70 20 c# asp.net ajax asp.net-mvc

大多数ajax框架似乎在标头或查询字符串上使用"X-Request-With"进行标准化.

在ASP.NET MVC中,您可以使用扩展方法

Request.IsAjaxRequest()
Run Code Online (Sandbox Code Playgroud)

因为ajax客户端可以请求几种不同的内容类型,而不仅仅是"application/json"ex:"application/xml".

我正在使用以下代码片段/扩展方法,但我希望看到其他人在做什么,或者是否有我错过的内容,或更好的方法.

public static bool IsJsonRequest(this HttpRequestBase request)
{
    return request.Headers["Accept"].Split(',') 
       .Any(t => t.Equals("application/json", StringComparison.OrdinalIgnoreCase));
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Pet*_*ham 21

您应该使用请求的接受标头.这表示客户端希望服务器向其发送什么类型的内容.

不要使用请求的内容类型标头 - 这表示请求消息正文的类型.通过一切手段将其设置为"application/JSON"如果你正在张贴或把一些JSON来在服务器上,但如果你是一个GET请求,那么内容类型应该是空的(如GET请求的主体为空),如果您要发布多部分表单或其他内容,则应该反映该类型.

Web上表单的行为是将请求内容类型设置为"multipart/form-data",将accept类型设置为"text/html".在Web上,重载服务器以使其返回与请求内容类型相同的类型,同时忽略accept类型标头将意味着已发布的表单返回编码的表单数据而不是html页面.这显然不是正确的行为,因此不要围绕请求内容类型的这种解释构建应用程序.


gia*_*min 6

我发现皮特·柯卡姆的回答非常有用。我认为这应该标记为解决方案。

这是我的代码:

/// <summary>
/// Determines whether the request is a Json Request
/// </summary>
public static bool GetIsJsonRequest(HttpRequest request)
{
    if (request == null)
    {
        throw new ArgumentNullException("request");
    }
    bool rtn = false;
    const string jsonMime = "application/json";

    if (request.AcceptTypes!=null)
    {
        rtn = request.AcceptTypes.Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
    }
    return rtn || request.ContentType.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
}
Run Code Online (Sandbox Code Playgroud)

- -更新 - -

根据@Mvision 建议,这是 MVC 版本:

public static bool GetIsJsonRequest(HttpRequestBase request)
{
    if (request == null)
    {
        throw new ArgumentNullException("request");
    }
    bool rtn = false;
    const string jsonMime = "application/json";

    if (request.AcceptTypes!=null)
    {
        rtn = request.AcceptTypes.Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
    }
    return rtn || request.ContentType.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
}
Run Code Online (Sandbox Code Playgroud)

如果您需要在 ASP.NET Classic 和 MVC 中使用此方法,建议使用第二种方法。要转换HttpRequest只需HttpREquestBase将其包装起来HttpRequestWrapper

public static bool GetIsJsonRequest(HttpRequest request)
{
    return GetIsJsonRequest(new HttpRequestWrapper(request));
}
Run Code Online (Sandbox Code Playgroud)


Lam*_*mps 4

为什么不能只从发出请求的客户端传递一个 bool 变量(例如 IsJsonRequest)?

然后在操作方法中进行检查。

或者

您可以为此使用请求的接受标头。这表明客户端希望服务器向其发送什么类型的内容。