Bei Verwendung von MVC war die Rückgabe von Ad-hoc-Json einfach.
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 verarbeitet werden können.
Ich habe dies durch diesen JsonNetFormatter ersetzt, der auf Json.Net basiert . Das funktioniert wenn ich benutze
public object Test()
{
return new { Message = "Hello" };
}
Aber ich sehe keinen Sinn darin, die Web-API zu verwenden, wenn ich nicht zurückkehre HttpResponseMessage
. Ich sollte besser bei Vanilla MVC bleiben. Wenn ich versuche und benutze:
public HttpResponseMessage<object> Test()
{
return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK);
}
Es serialisiert das Ganze HttpResponseMessage
.
Kann mich jemand zu einer Lösung führen, bei der ich anonyme Typen innerhalb von a zurückgeben kann HttpResponseMessage
?
quelle
Diese Antwort mag etwas spät kommen, aber ab heute
WebApi 2
ist sie bereits veröffentlicht und jetzt ist es einfacher zu tun, was Sie wollen. Sie müssten nur noch Folgendes tun:public object Message() { return new { Message = "hello" }; }
und entlang der Pipeline, wird es serialisiert
xml
oderjson
nach Kundenpräferenzen (derAccept
Kopf). Ich hoffe, dies hilft jedem, der über diese Frage stolpertquelle
Exception
?In der Web-API 2 können Sie das neue IHttpActionResult verwenden, das HttpResponseMessage ersetzt, und dann ein einfaches Json-Objekt zurückgeben: (Ähnlich wie MVC)
public IHttpActionResult GetJson() { return Json(new { Message = "Hello"}); }
quelle
Sie können JsonObject dafür verwenden:
dynamic json = new JsonObject(); json.Message = "Hello"; json.Value = 123; return new HttpResponseMessage<JsonObject>(json);
quelle
Sie könnten ein ExandoObject verwenden . (hinzufügen
using System.Dynamic;
)[Route("api/message")] [HttpGet] public object Message() { dynamic expando = new ExpandoObject(); expando.message = "Hello"; expando.message2 = "World"; return expando; }
quelle
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());
quelle
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/
quelle
Sie sollten in der Lage sein, dies zum Laufen zu bringen, wenn Sie Generika verwenden, da Sie dadurch einen "Typ" für Ihren anonymen Typ erhalten. 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
DataContract
oder keineDataMebmer
Attribute enthält, wird auf die Serialisierung aller öffentlichen Eigenschaften zurückgegriffen, die genau das tun sollten, wonach Sie suchen.(Ich werde erst später heute die Möglichkeit haben, dies zu testen. Lassen Sie mich wissen, wenn etwas nicht funktioniert.)
quelle
Sie können ein dynamisches Objekt in ein zurückgegebenes Objekt wie 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; }
quelle
public IEnumerable<object> GetList() { using (var context = new DBContext()) { return context.SPersonal.Select(m => new { FirstName= m.FirstName , LastName = m.LastName }).Take(5).ToList(); } } }
quelle