webentwicklung-frage-antwort-db.com.de

Rückgabe anonymer Typen mit der Web-API

Bei Verwendung von MVC war es einfach, adhoc Json zurückzugeben.

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

Ich suche diese Funktionalität mit der neuen Web-API.

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

Dies löst eine Ausnahme aus, da DataContractJsonSerializer anonyme Typen nicht verarbeiten kann.

Ich habe dies durch dieses JsonNetFormatter ersetzt, basierend auf Json.Net . Das funktioniert wenn ich benutze

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

aber ich sehe keinen Sinn darin, Web-API zu verwenden, wenn ich nicht HttpResponseMessage zurückgebe. Ich halte mich besser an Vanilla MVC. Wenn ich versuche und benutze:

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

Es serialisiert das gesamte HttpResponseMessage.

Kann mich jemand zu einer Lösung führen, bei der ich anonyme Typen innerhalb eines HttpResponseMessage zurückgeben kann?

71
Magpie

Dies funktioniert in der Beta-Version nicht, aber in den neuesten Bits (erstellt von http://aspnetwebstack.codeplex.com ), so dass es wahrscheinlich der Weg für RC sein wird. Du kannst tun

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

Diese Antwort mag etwas spät kommen, aber ab heute WebApi 2 ist bereits draußen und jetzt ist es einfacher zu tun, was Sie wollen, Sie müssten nur noch tun:

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

und entlang der Pipeline wird es entsprechend den Kundenpräferenzen (dem Header xml) zu json oder Accept serialisiert. Ich hoffe, das hilft jedem, der über diese Frage stolpert

16
Luiso

sie können JsonObject dafür verwenden:

dynamic json = new JsonObject();
json.Message = "Hello";
json.Value = 123;

return new HttpResponseMessage<JsonObject>(json);
6
SeriousM

Sie können ein ExandoObject verwenden. (addiere using System.Dynamic;)

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

In der Web-API 2 können Sie das neue IHttpActionResult verwenden, das HttpResponseMessage ersetzt, und anschließend ein einfaches Json-Objekt zurückgeben: (Ähnlich wie MVC)

public IHttpActionResult GetJson()
    {
       return Json(new { Message = "Hello"});
    }
4
D.B

Sie können auch versuchen:

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());
3
leojh

Sie sollten in der Lage sein, dies zum Laufen zu bringen, wenn Sie Generika verwenden, da dies Ihnen einen "Typ" für Ihren anonymen Typ gibt. Sie können dann den Serializer daran binden.

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

Wenn Ihre Klasse keine Attribute DataContract oder DataMebmer enthält, wird auf die Serialisierung aller öffentlichen Eigenschaften zurückgegriffen, die genau das tun sollten, wonach Sie suchen.

(Ich werde bis heute keine Gelegenheit haben, dies zu testen. Lassen Sie mich wissen, wenn etwas nicht funktioniert.)

2

In ASP.NET Web API 2.1 können Sie dies auf einfachere Weise tun:

public dynamic Get(int id) 
{
     return new 
     { 
         Id = id,
         Name = "X"
     };
}

Weitere Informationen hierzu finden Sie unter https://www.strathweb.com/2014/02/dynamic-action-return-web-api-2-1/

Sie können ein dynamisches Objekt wie in ein zurückgegebenes Objekt einkapseln

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

und dann in WebAPI; mach so etwas wie:

[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;
}
0
Subodh Pushpak