Подтвердить что ты не робот

Как вернуть объект Json в Web API Controller

Я использовал этот ниже код на моем контроллере asp.net, чтобы вернуть объект Json на мой Ajax на javascript

public JsonResult myMethod()
{
    // return a Json Object, you could define a new class
    return Json(new
    {
        Success = true, //error
        Message = "Success" //return exception
    });
}

Jquery-Ajax:

$.ajax({
    type: "POST",
    url: url_ ,
    data: search,
    success: function(data) {   
        //Show Json Properties from Controller ( If Success == false show exception Message from controller )
        if (data.Success)  
        {
            alert(data.Message); //display success 
        }
        else
        {
            alert(data.Message) //display exception
        }
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("error: " + XMLHttpRequest.responseText);
    },
    dataType: 'json'
});

Как это можно сделать на Web Api Controller?

Можете ли вы привести несколько примеров или ссылок в качестве ссылки.

Спасибо и с уважением

4b9b3361

Ответ 1

Если вы создаете себе новый класс HttpContent для доставки JSON, например...

 public class JsonContent : HttpContent {

    private readonly MemoryStream _Stream = new MemoryStream();
    public JsonContent(object value) {

        Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var jw = new JsonTextWriter( new StreamWriter(_Stream));
        jw.Formatting = Formatting.Indented;
        var serializer = new JsonSerializer();
        serializer.Serialize(jw, value);
        jw.Flush();
        _Stream.Position = 0;

    }
    protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) {
        return _Stream.CopyToAsync(stream);
    }

    protected override bool TryComputeLength(out long length) {
        length = _Stream.Length;
        return true;
    }
}

Тогда вы можете сделать,

      public HttpResponseMessage Get() {
            return new HttpResponseMessage() {
                Content = new JsonContent(new
                {
                    Success = true, //error
                    Message = "Success" //return exception
                })
            };
        }

так же, как и с JsonResult.

Ответ 2

ASP.NET Web API работает с немного другой философией. Вы должны вернуть только сущность (или набор сущностей), и механизм согласования контента должен вернуть его клиенту в том формате, который он запросил. Подробнее о переговорах по содержимому вы можете прочитать здесь:

Вы можете, конечно, обходить недопустимость содержимого, возвращая HttpResponseMessage. В этом случае вам нужно сериализовать объект непосредственно в JSON (основы этого подхода также описаны в упомянутой выше статье).

Ответ 3

После прочтения ответа tpeczek, ответа Даррела Миллера и их комментария в ответе tpeczek, я хотел получить больше рекомендаций о том, когда и почему я могу использовать Web Api и его механизм согласования контента. Ссылка tpeczek информативна и полезна, но я нашел пару других рецензий, которые были более ориентированы на сравнение использования Web Api (и его согласования содержимого) с, скажем, с обычными действиями контроллера MVC 4, которые возвращают JsonResult. Вот те, которые я нашел полезными для принятия такого решения. Один из авторов приходит к выводу, что он предпочитает использовать простые контроллеры MVC 4, в то время как другой автор предпочитает использовать контроллеры Web Api:

Создание общедоступного HTTP-API для данных

Я считаю, что в вышеупомянутом сообщении автора есть одна коррекция. Там он упоминает, что

"... каждый метод [Controller], который начинается с" Get ", автоматически связанный с глаголом GET. Звучит здорово? Это так, но это также означает, что у вас нет двух методов, чье имя начинается с" Get" в тот же класс контроллера.

В соответствии с этим ответом у вас действительно может быть несколько методов Get в одном контроллере, если вы укажете атрибут ActionName, Теперь вот второе сообщение:

API ASP.NET Web API и API-интерфейсы ASP.NET MVC