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

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

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

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.

Вы хотите проверить заголовок 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
Другие вопросы по тегам