Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';这是在ASP.NET上检测JSON请求的最佳方法_C#_Asp.net_Asp.net Mvc_Ajax - Fatal编程技术网

C# 什么';这是在ASP.NET上检测JSON请求的最佳方法

C# 什么';这是在ASP.NET上检测JSON请求的最佳方法,c#,asp.net,asp.net-mvc,ajax,C#,Asp.net,Asp.net Mvc,Ajax,大多数ajax框架似乎在头或查询字符串上使用“X-Request-with”进行标准化 在ASP.NET MVC中,您可以使用扩展方法 Request.IsAjaxRequest() 因为ajax客户机可以请求几种不同的内容类型,而不仅仅是“application/json”如“application/xml” 我正在使用下面的代码片段/扩展方法,但我希望看到其他人在做什么,或者我是否遗漏了什么,或者有更好的方法 public static bool IsJsonRequest(this Ht

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

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

Request.IsAjaxRequest()
因为ajax客户机可以请求几种不同的内容类型,而不仅仅是“application/json”如“application/xml”

我正在使用下面的代码片段/扩展方法,但我希望看到其他人在做什么,或者我是否遗漏了什么,或者有更好的方法

public static bool IsJsonRequest(this HttpRequestBase request)
{
    return request.Headers["Accept"].Split(',') 
       .Any(t => t.Equals("application/json", StringComparison.OrdinalIgnoreCase));
}
提前感谢。

您可以使用

Request.ContentType 

在您使用的任何控制器方法中。如果需要在多个位置执行工作,也可以将其放入ActionFilterAttribute中。

为什么不能从发出请求的客户端传递一个bool变量,比如IsJsonRequest

然后做一个检查动作方法

您可以为此使用请求的accept标头。这表示客户端希望服务器发送给它的内容类型。

您可以使用

Request.IsAjaxRequest()
所以你可以查一下

if (Request.IsAjaxRequest())
{
   return new JsonResult();
}
return ActionResult

您应该为此使用请求的。这表示客户端希望服务器发送给它的内容类型

不要使用请求的头-这表示是请求消息正文的类型。如果您正在向服务器发布或放置一些json,请务必将其设置为“application/json”,但如果您正在发出GET请求,则内容类型应为空(因为GET请求的主体为空),如果您正在发布多部分表单或其他内容,则应反映该类型

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

我发现这种方法非常有用。我认为这应该被标记为解决方案

这是我的代码:

/// <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));
}
如果您需要在asp.net classic和MVC中使用此方法,建议使用第二种方法。 要在
HttpREquestBase
中转换
HttpRequest
,只需使用
HttpRequestWrapper
包装它即可:

public static bool GetIsJsonRequest(HttpRequest request)
{
    return GetIsJsonRequest(new HttpRequestWrapper(request));
}

希望这会更有效率

public static class JsonResultController
{
    public static bool IsJsonRequest(this HttpRequestBase request)
    {
        return GetIsJsonRequest(request);
    }

    public static bool IsJsonRequest(this HttpRequest request)
    {
        return GetIsJsonRequest(request);
    }

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

        if (request.AcceptTypes != null)
        {
            rtn = (request.AcceptTypes as string[]).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
        }
        return rtn || (request.ContentType as string ?? "").Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
    }
}

为什么需要检测json接受类型?我只是好奇,因为我对JSON使用不同的方法results@Xelibrion我希望重用相同的操作,如果唯一的区别是结果类型,则没有重复的地方,我可以通过上面的代码很容易地检测到结果类型。您的代码正在检查它是否是AjaxRequest。谢谢,但如果您看我的示例,我已经在检查了。但是,ajax请求可能会要求xml,甚至在部分请求的情况下要求html(使用MVC)。我正在寻找专门请求JSON的过滤器。这个答案并没有回答这个问题,它被上推了两次!谢谢,但是Request.ContentType不起作用,显示为“”(空字符串)。这有点多余,因为大多数ajax api已经有了这些信息或默认信息。例如:在Try this Request.ContentType.StartsWith(“application/json”,StringComparison.OrdinalIgnoreCase)上查看“dataType”,它应该可以工作@Bhaskar,谢谢,但那不行。我在下面的一条评论中提到了该请求。ContentType是一个空字符串,但有“application/json”的标题。请尝试在json请求中设置ContentType字段,ContentType:“application/json;charset=utf-8”,嘿,我已经更新了我的答案。请尝试这一请求。AcceptTypes.Contains(“application/json”)有趣的解决方案,由于filterContext.HttpContext.Request是一个HttpRequestBase,您可以安全地修改代码以容纳HttpRequestBase,使其对尝试在属性中使用此属性的MVC人员更友好:)@Mvision好主意!但是我是一个老的aspnet家伙:D,我不想每次都包装我的请求:
newhttprequestwrapper(Context.request)
。无论如何,我会更新我的答案给年轻的MVC球员:DD
public static class JsonResultController
{
    public static bool IsJsonRequest(this HttpRequestBase request)
    {
        return GetIsJsonRequest(request);
    }

    public static bool IsJsonRequest(this HttpRequest request)
    {
        return GetIsJsonRequest(request);
    }

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

        if (request.AcceptTypes != null)
        {
            rtn = (request.AcceptTypes as string[]).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
        }
        return rtn || (request.ContentType as string ?? "").Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase));
    }
}