2012-07-09 13 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。

相关问题