Возврат анонимных типов с помощью 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?

553   8  

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

    Ничего не найдено.