2

MVC3 から ASP.NET MVC4 を使用するようにプロジェクトをアップグレードしました。現在、コントローラーはコントローラーの代わりに ApiController を使用しています。以前は、関数を次のように使用していました。

 public JsonResult GetPermissions(string portfolioId)
 {
     //DO THE DATA FETCH
     return Json(new { PermissionValues = permissionValues,       UserPermissions = userPermissions, OwnerValues = ownerList },JsonRequestBehavior.AllowGet);
 } 

ApiControllers を使用して同様の操作を行いたいと思います。オブジェクトが 3 つのプロパティを持つ別のオブジェクトを作成したくありません [3 つのリストを返すため]。関数の戻り値の型として使用しようとしましHttpResponseMessage<Object>たが、うまくいかないようです。

    public HttpResponseMessage<Object> GetPermissions(string portfolioId)
    {
      //DO THE DATA FETCH
      HttpResponseMessage<Object> response = new HttpResponseMessage<Object>(new { Users = listedUsers, PermissionValues = permissionValues });
      return response;
    }

何か案は ?

4

1 に答える 1

1

あなたが抱えている主な問題は、ベータビットのjson応答のデフォルトのシリアライザーが匿名型をシリアル化できないことです。Json.NET(次のドロップで組み込まれる予定)に基づくものなど、可能なフォーマッターを使用する必要があります。これをベータ版で機能させるには、コードを次のように変更します。

public HttpResponseMessage Get()
{
    var content = new { Users = new List<string> { "John", "Mary" }, Permissions = new List<string> { "User", "Admin" } };
    return new HttpResponseMessage<object>(content, new[] { new JsonNetFormatter() });
}

これにより、次のような応答が得られます。

{"Users":["John","Mary"],"Permissions":["User","Admin"]}

RCが利用可能になると、既存のコードは正常に機能するはずです。

アップデート:

このコードをコンパイルするには、JsonNetFormatterの実装が必要です。Henrik(MSFT)が提供する実装はhttp://code.msdn.microsoft.com/Using-JSONNET-with-ASPNET-b2423706#contentで、またはWebApiContribプロジェクト(https://github.com/WebApiContrib )から見つけることができます。 /WebAPIContrib/blob/master/src/WebApiContrib.Formatting.JsonNet/JsonNetFormatter.cs

どちらもOnWriteToStreamAsyncメソッドで同じバグに悩まされていることに注意してください。これらの実装は、基になるストリームを閉じます。usingステートメントを次のように変更する必要があります。

using (var jsonTextWriter = new JsonTextWriter(new StreamWriter(stream, Encoding)) { CloseOutput = false })

Henrikはブログでこれを指摘しましたが、彼のサンプルもcontribプロジェクトも更新されておらず、contribプロジェクトの修正をコミットする時間がありませんでした。;)

于 2012-05-24T15:47:46.837 に答える