使用Web API返回匿名types

使用MVC时,返回adhoc Json很容易。

return Json(new { Message = "Hello"}); 

我正在寻找这个新的Web API的function。

 public HttpResponseMessage<object> Test() { return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK); } 

这会引发一个exception,因为DataContractJsonSerializer无法处理匿名types。

我用这个基于Json.Net的JsonNetFormatter取代了这个。 这个如果我使用的话

  public object Test() { return new { Message = "Hello" }; } 

但是如果我没有返回HttpResponseMessage ,我就没有看到使用Web API的意义,我最好坚持使用vanilla MVC。 如果我尝试使用:

 public HttpResponseMessage<object> Test() { return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK); } 

它序列化整个HttpResponseMessage

任何人都可以指导我的解决scheme,我可以在HttpResponseMessage内返回匿名types?

这在Beta版本中不起作用,但它在最新的版本中(从http://aspnetwebstack.codeplex.com构build),所以它可能是RC的方式。; 你可以做

 public HttpResponseMessage Get() { return this.Request.CreateResponse( HttpStatusCode.OK, new { Message = "Hello", Value = 123 }); } 

这个答案可能会有点晚,但是WebApi 2已经出来了,现在更容易做到你想做的事情:

 public object Message() { return new { Message = "hello" }; } 

并沿着pipe道将根据客户端的偏好( Accept头)序列化为xmljson 。 希望这有助于任何人绊倒这个问题

你可以使用这个JsonObject:

 dynamic json = new JsonObject(); json.Message = "Hello"; json.Value = 123; return new HttpResponseMessage<JsonObject>(json); 

你可以使用一个ExandoObject 。 using System.Dynamic;添加using System.Dynamic;

 [Route("api/message")] [HttpGet] public object Message() { dynamic expando = new ExpandoObject(); expando.message = "Hello"; expando.message2 = "World"; return expando; } 

你也可以尝试:

 var request = new HttpRequestMessage(HttpMethod.Post, "http://leojh.com"); var requestModel = new {User = "User", Password = "Password"}; request.Content = new ObjectContent(typeof(object), requestModel, new JsonMediaTypeFormatter()); 

如果你使用generics,你应该能够得到这个工作,因为它会给你一个匿名types的“types”。 然后你可以绑定序列化程序。

 public HttpResponseMessage<T> MakeResponse(T object, HttpStatusCode code) { return new HttpResponseMessage<T>(object, code); } 

如果您的类中没有DataContractDataMebmer属性,它将回退序列化所有公共属性,这应该完全符合您的要求。

(我今天晚些时候才能有机会testing,如果有什么不行的话,请告诉我。)

你可以将dynamic对象封装在返回对象中

 public class GenericResponse : BaseResponse { public dynamic Data { get; set; } } 

然后在WebAPI中; 做一些事情:

 [Route("api/MethodReturingDynamicData")] [HttpPost] public HttpResponseMessage MethodReturingDynamicData(RequestDTO request) { HttpResponseMessage response; try { GenericResponse result = new GenericResponse(); dynamic data = new ExpandoObject(); data.Name = "Subodh"; result.Data = data;// OR assign any dynamic data here;// response = Request.CreateResponse<dynamic>(HttpStatusCode.OK, result); } catch (Exception ex) { ApplicationLogger.LogCompleteException(ex, "GetAllListMetadataForApp", "Post"); HttpError myCustomError = new HttpError(ex.Message) { { "IsSuccess", false } }; return Request.CreateErrorResponse(HttpStatusCode.OK, myCustomError); } return response; }