使用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
头)序列化为xml
或json
。 希望这有助于任何人绊倒这个问题
你可以使用这个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); }
如果您的类中没有DataContract
或DataMebmer
属性,它将回退序列化所有公共属性,这应该完全符合您的要求。
(我今天晚些时候才能有机会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; }