什么';是在ASP.NET上检测JSON请求的最佳方法
本文关键字:JSON 检测 请求 方法 最佳 NET 是在 ASP 什么 | 更新日期: 2023-09-27 17:58:14
大多数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));
}
提前谢谢。
您应该为此使用请求的accept标头。这表示客户端希望服务器向其发送什么类型的内容
不要使用请求的内容类型标头-这表示请求消息的正文类型。如果您正在向服务器发布或PUTting一些json,请将其设置为"application/json",但如果您正在发出GET请求,则内容类型应为空(因为GET请求的主体为空),如果您正在发布多部分表单或其他内容,则应反映该类型。
web上表单的行为是将请求内容类型设置为"multipart/form-data",并将接受类型设为"text/html"。在web上,重载服务器,使其返回与请求内容类型相同的类型,同时忽略接受类型标头,这意味着发布的表单返回编码的表单数据,而不是html页面。这显然不是正确的行为,所以不要围绕对请求内容类型的这种解释来构建应用程序。
我发现Pete Kirkham的答案非常有用。我认为这应该被标记为解决方案。
这是我的代码:
/// <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));
}
---更新---
令人难以置信的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));
}
如果您需要在asp.net classic和MVC中都使用此方法,则建议使用第二种方法。要在HttpREquestBase
中转换HttpRequest
,只需使用HttpRequestWrapper
:将其包裹即可
public static bool GetIsJsonRequest(HttpRequest request)
{
return GetIsJsonRequest(new HttpRequestWrapper(request));
}
为什么不能从发出请求的客户端传递一个bool变量,比如IsJsonRequest?
然后制定签入操作方法。
或
您可以为此使用请求的accept标头。这表示客户端希望服务器向其发送什么类型的内容。
您可以使用
Request.IsAjaxRequest()
所以你可以检查
if (Request.IsAjaxRequest())
{
return new JsonResult();
}
return ActionResult
您可以使用
Request.ContentType
在您使用的任何控制器方法中。如果需要在多个位置执行工作,也可以将其放置在ActionFilterAttribute中。
希望这将是更有效的
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));
}
}