C# 什么';这是在ASP.NET上检测JSON请求的最佳方法
大多数ajax框架似乎在头或查询字符串上使用“X-Request-with”进行标准化 在ASP.NET MVC中,您可以使用扩展方法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
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));
}
}