Возврат анонимных типов с помощью Web API
При использовании MVC возвращение adhoc 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
?
Ответы
Ответ 1
Это не работает в бета-версии, но в последних битах (построено из http://aspnetwebstack.codeplex.com), поэтому он будет вероятно, станет для RC. Вы можете сделать
public HttpResponseMessage Get()
{
return this.Request.CreateResponse(
HttpStatusCode.OK,
new { Message = "Hello", Value = 123 });
}
Ответ 2
Этот ответ может быть немного запоздалым, но на сегодняшний день WebApi 2
уже вышел, и теперь легче делать то, что вы хотите, просто вам нужно сделать:
public object Message()
{
return new { Message = "hello" };
}
а по конвейеру он будет сериализован в соответствии с xml
или json
в соответствии с предпочтениями клиента или клиента (заголовок Accept
). Надеюсь, это поможет любому, кто наткнулся на этот вопрос.
Ответ 3
вы можете использовать JsonObject для этого:
dynamic json = new JsonObject();
json.Message = "Hello";
json.Value = 123;
return new HttpResponseMessage<JsonObject>(json);
Ответ 4
Вы можете использовать ExandoObject. (добавить using System.Dynamic;
)
[Route("api/message")]
[HttpGet]
public object Message()
{
dynamic expando = new ExpandoObject();
expando.message = "Hello";
expando.message2 = "World";
return expando;
}
Ответ 5
Вы также можете попробовать:
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());
Ответ 6
Вы должны иметь возможность заставить это работать, если вы используете дженерики, так как это даст вам "тип" для вашего анонимного типа. Затем вы можете привязать сериализатор к этому.
public HttpResponseMessage<T> MakeResponse(T object, HttpStatusCode code)
{
return new HttpResponseMessage<T>(object, code);
}
Если в вашем классе нет атрибутов DataContract
или DataMebmer
, он будет возвращаться к сериализации всех общедоступных свойств, что должно делать именно то, что вы ищете.
(У меня не будет возможности проверить это до более позднего дня, дайте мне знать, если что-то не работает.)
Ответ 7
Вы можете инкапсулировать динамический объект в возвращаемый объект, например
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;
}