【问题标题】:How to return multiple object type for ApiControllers如何为 ApiControllers 返回多个对象类型
【发布时间】:2012-05-31 04:00:52
【问题描述】:

我已将我的项目升级为使用来自 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;
    }

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-web-api


    【解决方案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 或从 WebApiContrib 项目在 https://github.com/WebApiContrib/WebAPIContrib/blob/master/src/WebApiContrib.Formatting.JsonNet/JsonNetFormatter.cs 找到 Henrik (MSFT) 提供的实现。

    注意,它们都在 OnWriteToStreamAsync 方法中遇到相同的错误。这些实现关闭了底层流。您需要将 using 语句更改为如下所示:

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

    Henrik 在他的博客中指出了这一点,但他的示例和 contrib 都没有更新,我只是没有时间将修复提交到 contrib 项目。 ;)

    【讨论】:

    • 感谢您的回复。我对此有疑问 - 我添加了 Newtonsoft.Json 参考,但是当我尝试构建时,它抛出异常“找不到类型或命名空间名称'JsonNetFormatter'”。
    • HttpResponseMessage 中插入格式化程序是个坏主意。 Conneg 不适用于此实现。如果 OP 不需要 Conneg,为什么还要使用 Web API?只需使用 MVC JsonResult 将其返回即可。另一方面,对于不包含通用响应和请求消息的产品,此代码将中断。
    • @tugberk 我同意你的观点,一般来说,最好利用内容协商。但是,OP 显然打算显式返回 json 响应。
    • @DPeden 那么,JsonResult 没有错,因为 OP 正在使用 MVC。该示例完全违反了 ASP.NET Web API 的主要原则。如果意图只是为每个请求返回 Json 响应,那么我建议删除除 JsonMediaTypeFormatter 之外的所有其他格式化程序。
    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多