2012-07-09 37 views
2

使用ASP.NET Web API時,如何檢查請求內容類型,無論是application/xml還是application/json?我知道ASP.NET Web API中的內容協商,但它不適用於我,因爲我只從XML格式的數據庫中獲取數據。因此,如果我可以檢查請求內容類型,那麼當請求內容類型爲XML時,我可以將XML轉換爲json,否則只返回XML。ASP.NET Web 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。

相關問題