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

您遇到的主要问题是 Beta 位中 json 响应的默认序列化程序无法序列化匿名类型。您需要使用可以的格式化程序,例如基于 Json.NET 的格式化程序(将在下一个 drop 中内置)。为了使这项工作与 Beta 版一起使用,您的代码将更改为如下所示:

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 的实现。您可以在http://code.msdn.microsoft.com/Using-JSONNET-with-ASPNET-b2423706#content或在https://github.com/WebApiContrib的 WebApiContrib 项目中找到 Henrik (MSFT) 提供的实现/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 回答