2012-07-09 2 views
2

ASP.NET 웹 API를 사용하는 동안 요청 콘텐츠 유형이 application/xml 또는 application/json인지 여부를 어떻게 확인할 수 있습니까? ASP.NET 웹 API의 내용 협상에 대해 알고 있지만 XML 형식의 데이터베이스에서만 데이터를 가져 오기 때문에 나에게 도움이되지 않습니다. 따라서 요청 콘텐츠 형식을 확인할 수 있다면 콘텐츠 형식이 XML 인 경우 XML을 json으로 변환 할 수 있습니다. 그렇지 않으면 단순히 XML 만 반환합니다.ASP.NET 웹 API는 요청 콘텐츠 유형을 확인하여 JSON 또는 XML로 데이터를 반환합니다.

미리 감사드립니다.

답변

0

헤더를 수락하여 JSON과 XML을 다시 원하는지 확인하고 싶습니다. 이렇게하려면 컨텍스트의 요청 헤더를 검사해야합니다. 적어도 두 가지 방법이 있습니다.

# 1 옵션 - API 제어 방법의 내부에 구현

당신의 API 메소드 내부에 내부의 무엇을 검사 할합니다 :

this.ControllerContext.Request.Headers.Accept 

옵션 # 2 - ActionFilterAttribute를 사용하여

그로인 해 클라이언트를 검사하여 돌아 오기를 원하고있다.

public class HttpUserContextFilterAttribute : ActionFilterAttribute 
{   
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     //Here is where you can inspect the headers 
     //e.g. look into actionContext.Request.Headers.Accept 
0

apiController에서 상속 받아 새로운 ApiController 클래스를 만들고 JsonContent 동작을 추가하십시오.

public class ApiCustomController: System.Web.Http.ApiController { 
    public class JsonContent : ActionMethodSelectorAttribute { 

     public override bool IsValidForRequest(
      ControllerContext controllerContext 
      , System.Reflection.MethodInfo methodInfo) { 

      var Request = controllerContext.HttpContext.Request; 
      string requestedWith = Request.ServerVariables["HTTP_X_REQUESTED_WITH"] ?? string.Empty; 
      return string.Compare(requestedWith, "XMLHttpRequest", true) == 0 
       && Request.ContentType.ToLower().Contains("application/json"); 
     } 
    } 

} 

그런 다음 컨트롤러에서 사용자 지정 컨트롤러 클래스, "ApiCustomController"상속과 ActionMethodSelectorAttribute "JsonContent"를 사용합니다.

public class IngredientsController : App_a_matic.Controllers.ApiController { 
    // GET api/values 
    [HttpGet] 
    [JsonContent] 
    public IEnumerable<string> Get() { 
     return new string[] { "value1", "value2" }; 
    } 
} 

이 당신이에 보내고있다 "contentType의 '응용 프로그램/JSON'"와 같은 :

$(function() { 
     $.ajax({ 
      url: 'api/Products/Ingredients' 
      , contentType: 'application/json' 
      , dataType: 'json' 
      , type: 'GET' 
      , success: function (result) { 
       console.log(result); 
      } 
     }); 
    }) 

만해서 getJSON를 사용하는 반대로합니다.