2

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

提前致谢。

4

2 回答 2

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

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

而不是仅仅使用 getJson。

于 2013-03-27T17:27:00.640 回答
0

您想要检查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
于 2012-10-16T17:12:01.277 回答