Seit ein paar Tagen versuche ich herauszufinden, wie aus meiner Web-API-generische Antwort - eine Wrapper-Klasse, wo eine Eigenschaft dynamisch zeigen Typ zurückgegeben haben.C# Web API - generische Wrapper-Klasse für alle API-Antworten
Below Codefragment zeigt, was ich erreichen will:
[RoutePrefix("api")]
public class TestController : ApiController
{
[HttpGet]
[Route("test")]
public HttpResponseMessage Test3()
{
Smth smth = new Smth()
{
Something = "dsfdsfdsfs"
};
object apiResponse = this.GetResponse(true, smth);
return base.Request.CreateResponse(HttpStatusCode.OK, apiResponse);
}
public object GetResponse(bool isSuccess, dynamic responseObject, string[] messages = null)
{
return new
{
is_success = isSuccess,
response_object = responseObject,
messages = messages
};
}
}
Leider ist dieser apporach funktioniert nicht - ich immer noch:
ExceptionMessage
Kann nicht serailization vom Typ ausführen <> f__AnonymousType0` 3 [System.Boolean, System.Object, System.String []] ...
Ausnahmetyp
System.Runtime.Serialization.InvalidDataContractException
Stacktrace
in System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException (String-Nachricht, Typ Typ) w System.Runtime.Serialization.DataContract.DataContractCriticalHelper. CreateDataContract (Int32-ID, RuntimeTypeHandle typeHandle, Typtyp) w System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation (Int32-ID, RuntimeTypeHandle typeHandle, Type type) w System.Runtime.Serialization.DataContractSerializer.GetDataContract (DataContract declaredTypeContract, Type declaredType, Geben Sie objectType) w System.Runtime.Seria ein lization.DataContractSerializer.InternalWriteObjectContent (XmlWriterDelegator writer, Objektdiagramm, DataContractResolver dataContractResolver) w System.Runtime.Serialization.DataContractSerializer.InternalWriteObject (XmlWriterDelegator writer, Objektdiagramm, DataContractResolver dataContractResolver) w System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions (XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) w System.Runtime.Serialization.DataContractSerializer.WriteObject (XmlWriter-Writer, Objektdiagramm) w System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream (Typ, Objektwert, Stream writeStream, HttpContent-Inhalt) w System. Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync (Typ Typ, Objekt Wert, Stream WriteStream, HttpContent Inhalt, TransportContext TransportContext, CancellationToken StornierungToken) --- Koniec śladu stosu z poprzedniej lokalisacji, w której wystąpił wyjątek --- w System.Runti me.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Aufgabenaufgabe) w System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabenaufgabe) w System.Net.Http.HttpContent.d__49.MoveNext() --- Koniec śladu stosu z poprzedniej lokalizacji, w której wystąpił wyjątek --- w System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Aufgabenaufgabe) w System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabenaufgabe) w System.Web.Http.Owin.HttpMessageHandlerAdapter.d__13.MoveNext()
bei meinen Recherchen fand ich im Forum einige Beispiele, die gut funktionieren:
[RoutePrefix("api")]
public class TestController : ApiController
{
[HttpGet]
[Route("test")]
public HttpResponseMessage Test3()
{
Smth smth = new Smth()
{
Something = "dsfdsfdsfs"
};
var apiReponse = new
{
is_success = true,
response_object = smth,
messages = new string[] { "dsfsfdds" }
};
return base.Request.CreateResponse(HttpStatusCode.OK, apiReponse);
}
}
Obiges Beispiel funktioniert und gibt Daten korrekt formatiert, aber eine solche pproach verursacht Fehler im Zusammenhang mit der Benennung (auf diese Weise muss ich jedes Mal, wenn ich es zurückgebe, die Antwortstruktur angeben).
Aus meiner Sicht gibt es keinen Unterschied in diesen beiden Ansätzen außer Tatsache, dass wir im ersten Fall anonymen Typ und im zweiten Fall mit Objekt arbeiten.
Die Frage ist also:
Ist es möglich, meinen ersten Ansatz funktioniert?
welche Fehler erhalten Sie? – derloopkat
Ich habe Ausnahmedetails hinzugefügt, aber ich abgeschnitten Fragment der Ausnahmebedingungsnachricht - es war nicht in Englisch :) – Piotr
versuchen Serialisierung des dynamischen Objekts zu einer Zeichenfolge mit Json. Wenn das fehlschlägt, serialisieren Sie das ganze verdammte Ding – Kell