【问题标题】:ASP.NET Web API return data in JSON or XML by checking Request content typeASP.NET Web API 通过检查请求内容类型以 JSON 或 XML 格式返回数据
【发布时间】:2012-07-09 20:17:49
【问题描述】:

在使用 ASP.NET Web API 时,如何检查请求内容类型是 application/xml 还是 application/json?我知道 ASP.NET Web API 中的内容协商,但它不适用于我,因为我只从数据库中获取 XML 格式的数据。因此,如果我可以检查请求内容类型,我可以在请求内容类型为 XML 时将 XML 转换为 json,否则只需返回 XML。

提前致谢。

【问题讨论】:

    标签: asp.net-web-api content-negotiation


    【解决方案1】:

    您想要检查 Accept 标头以查看他们是否想要返回 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
    

    【讨论】:

      【解决方案2】:

      新建一个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: 'application/json'”中发送的,例如:

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

      而不是仅仅使用 getJson。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 2016-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多