web-dev-qa-db-ja.com

Web API ControllerでJsonオブジェクトを返す方法

私はasp.netコントローラで以下のコードを使用して、javascriptのAjaxでJsonオブジェクトを返しました

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でこれを行うにはどうすればよいですか?

参考としていくつかの例やURLを教えてください。

よろしく

23
BizApps

JSONを配信するための新しいHttpContentクラスを自分で作成する場合、次のように...

 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で行うように。

25
Darrel Miller

ASP.NET Web APIは、少し異なる哲学で機能します。エンティティ(またはエンティティのセット)だけを返す必要があります。コンテンツネゴシエーションメカニズムは、彼が要求した形式でクライアントに返す必要があります。コンテンツネゴシエーションについて詳しくは、こちらをご覧ください。

もちろん、HttpResponseMessageを返すことにより、コンテンツのネゴシエーションをバイパスできます。この場合、オブジェクトを自分でJSONにシリアル化する必要があります(このアプローチの基本については、上記の記事でも説明しています)。

30
tpeczek

Tpeczekの回答、Darrel Millerの回答、およびtpeczekの回答でのコメントの会話を読んだ後、Web Apiとそのコンテンツネゴシエーションメカニズムを使用するタイミングまたは理由について、より多くのガイダンスを得たいと思いました。 tpeczekのリンクは有益で便利ですが、Web Apiの使用(およびそのコンテンツネゴシエーション)と、たとえばJsonResultを返すプレーンなMVC 4コントローラーアクションとの比較に適した他の記事がいくつか見つかりました。そのような決定を下すのに役立ったと思うものを以下に示します。著者の1人は、プレーンMVC 4コントローラーの使用を好む一方で、他の著者はWeb Apiコントローラーの使用を好むと結論付けています。

データ用のパブリックHTTP APIの構築

上記の著者の投稿には修正が必要だと思います。そこで彼はそれについて言及している、

「...「Get」で始まるすべての[Controller]メソッドは、自動的にGET動詞に関連付けられます。それはすばらしいですね。しかし、名前が「Get」で始まる2つのメソッドを使用できないことも意味します。同じコントローラクラスに。」

この回答によると、ActionName属性。次に、2番目の投稿を示します。

ASP.NET Web API vs. ASP.NET MVC“ API”

10
Jason Frank