Возврат анонимных типов с помощью Web API
когда с использованием MVC, возвращаясь специальный формат JSON был легким.
return Json(new { Message = "Hello"});
Я ищу эту функциональность с новым веб-API.
public HttpResponseMessage<object> Test()
{
return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK);
}
это вызывает исключение как DataContractJsonSerializer не может обрабатывать анонимные типы.
Я заменил это на это JsonNetFormatter на основе Json.Net.
Это работает, если я использую
public object Test()
{
return new { Message = "Hello" };
}
но я не вижу смысла использовать веб-API, если я не отвечаю HttpResponseMessage, Я бы лучше придерживаться ванили MVC. Если я попытаюсь использовать:
public HttpResponseMessage<object> Test()
{
return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK);
}
он сериализует все HttpResponseMessage.
может ли кто-нибудь направить меня к решению, где я могу вернуть анонимные типы в пределах HttpResponseMessage?
8 ответов:
Это не работает в бета-версии, но это делает в последних битах (построенный из http://aspnetwebstack.codeplex.com), так что, скорее всего, это будет путь для RC. Вы можете сделать
public HttpResponseMessage Get() { return this.Request.CreateResponse( HttpStatusCode.OK, new { Message = "Hello", Value = 123 }); }
этот ответ может прийти немного поздно, но на сегодняшний день
WebApi 2уже вышел и теперь легче делать то, что вы хотите, вам просто нужно сделать:public object Message() { return new { Message = "hello" }; }и вдоль трубопровода, он будет сериализован в
xmlилиjsonв соответствии с предпочтениями клиента (Acceptзаголовок). Надеюсь, это поможет любому, кто наткнется на этот вопрос
вы можете использовать JsonObject для этого:
dynamic json = new JsonObject(); json.Message = "Hello"; json.Value = 123; return new HttpResponseMessage<JsonObject>(json);
вы могли бы использовать ExandoObject. (добавить
using System.Dynamic;)[Route("api/message")] [HttpGet] public object Message() { dynamic expando = new ExpandoObject(); expando.message = "Hello"; expando.message2 = "World"; return expando; }
вы должны быть в состоянии получить эту работу, если вы используете дженерики, так как это даст вам "тип" для анонимного типа. Затем вы можете привязать сериализатор к этому.
public HttpResponseMessage<T> MakeResponse(T object, HttpStatusCode code) { return new HttpResponseMessage<T>(object, code); }Если нет
DataContractилиDataMebmerатрибуты вашего класса, он вернется к сериализации всех общедоступных свойств, которые должны делать именно то, что вы ищете.(у меня не будет возможности проверить это до сегодняшнего дня, дайте мне знать, если что-то не работает.)
вы также можете попробовать:
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());
In ASP.NET Web API 2.1 вы можете сделать это более простым способом:
public dynamic Get(int id) { return new { Id = id, Name = "X" }; }вы можете прочитать больше об этом на https://www.strathweb.com/2014/02/dynamic-action-return-web-api-2-1/
вы можете инкапсулировать динамический объект в возвращаемый объект, как
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; }
Comments