Веб-API ASP.NET возвращает данные в формате JSON или XML, проверяя тип содержимого запроса.

Как я могу проверить тип содержимого запроса при использовании веб-API ASP.NET, будь то приложение/xml или приложение/json? Я знаю о согласовании содержимого в веб-API ASP.NET, но у меня это не сработает, потому что я получаю данные из базы данных только в формате XML. Поэтому, если я могу проверить тип содержимого запроса, я могу преобразовать XML в json, если тип содержимого запроса — XML, в противном случае просто вернуть XML.

заранее спасибо.


person user1186065    schedule 09.07.2012    source источник


Ответы (2)


Вы хотите проверить заголовок 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
person Daron Cox    schedule 16.10.2012

Создайте новый класс 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.

person user69841    schedule 27.03.2013