我已将项目升级为使用MVC3中的ASP.NET MVC4。现在我的控制器正在使用ApiController而不是Controllers。以前我使用的函数是:
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;
}
有什么想法吗?
答案 0 :(得分:1)
您遇到的主要问题是Beta位中json响应的默认序列化程序无法序列化匿名类型。您需要使用可以使用的格式化程序,例如基于Json.NET的格式化程序(将在下一个内置中内置)。要使这与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/blob/master/src/WebApiContrib.Formatting.JsonNet/JsonNetFormatter.cs的WebApiContrib项目中找到Henrik(MSFT)提供的实现。
注意,它们都在OnWriteToStreamAsync方法中遇到相同的错误。这些实现关闭了底层流。您需要将using语句更改为:
using (var jsonTextWriter = new JsonTextWriter(new StreamWriter(stream, Encoding)) { CloseOutput = false })
Henrik在他的博客中注意到这一点,但他的样本和贡献者都没有更新,我只是没有时间将修复提交给contrib项目。 ;)