ASP.NET에서 JSON 요청을 탐지하는 가장 좋은 방법은 무엇입니까?
대부분의 Ajax 프레임워크는 헤더 또는 쿼리 문자열에서 "X-Request-With"로 표준화하는 것 같습니다.
그리고 ASP에서.NET MVC 확장 방법을 사용할 수 있습니다.
Request.IsAjaxRequest()
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));
}
잘 부탁드립니다.
이에 대해 요청의 수락 헤더를 사용해야 합니다.클라이언트가 서버로 보낼 내용 유형을 나타냅니다.
요청의 내용 유형 헤더를 사용하지 마십시오. 요청 메시지의 본문 유형을 나타냅니다.서버에 일부 Json을 게시하거나 PUT하는 경우에는 "application/json"으로 설정하십시오. 그러나 GET 요청을 작성하는 경우에는 내용 유형이 비어 있어야 합니다(GET 요청 본문이 비어 있기 때문에). 그리고 다중 부분 양식이나 다른 양식을 게시하는 경우에는 해당 유형을 반영해야 합니다.
웹에서 양식에 대한 동작은 요청 내용 유형을 'multipart/form-data'로 설정하고 수락 유형을 'text/html'로 설정하는 것입니다.웹에서 승인 유형 헤더를 무시하고 요청 내용 유형과 동일한 유형을 반환하도록 서버를 오버로드하는 것은 게시된 양식이 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 모두에서 이 방법을 사용해야 할 경우 두 번째 방법이 권장됩니다.변환하기HttpRequest
에HttpREquestBase
으로 그냥 포장합니다.HttpRequestWrapper
:
public static bool GetIsJsonRequest(HttpRequest request)
{
return GetIsJsonRequest(new HttpRequestWrapper(request));
}
왜 당신은 당신이 요청하는 고객으로부터 IsJsonRequest라는 부울 변수를 전달할 수 없습니까?
그런 다음 체크인 작업 방법을 만듭니다.
또는
이 경우 요청의 수락 헤더를 사용할 수 있습니다.클라이언트가 서버로 보낼 내용 유형을 나타냅니다.
사용할 수 있습니다.
Request.IsAjaxRequest()
확인하실 수 있습니다.
if (Request.IsAjaxRequest())
{
return new JsonResult();
}
return ActionResult
사용할 수 있습니다.
Request.ContentType
사용 중인 컨트롤러 방식에 관계없이 사용할 수 있습니다.여러 위치에서 작업하는 데 필요한 경우 작업 필터 속성에 이 속성을 배치할 수도 있습니다.
이것이 훨씬 더 효율적이기를 바랍니다.
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));
}
}
언급URL : https://stackoverflow.com/questions/6223063/whats-the-best-way-to-detect-a-json-request-on-asp-net
'programing' 카테고리의 다른 글
ASP.NET 웹 API 애플리케이션이 IIS 7에 배포될 때 404를 제공함 (0) | 2023.08.25 |
---|---|
상위 패딩 무시 (0) | 2023.08.25 |
SQL Management Studio에서 SQL XML 열을 쉽게 편집하는 방법 (0) | 2023.08.25 |
링크뿐만 아니라 버튼에서 파이어폭스의 점선 아웃라인을 제거하는 방법은 무엇입니까? (0) | 2023.08.25 |
MySQL - 여러 JOIN 일치 항목에 열 추가 (0) | 2023.08.25 |