2017-10-29 3 views
1

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?

+0

welche Fehler erhalten Sie? – derloopkat

+0

Ich habe Ausnahmedetails hinzugefügt, aber ich abgeschnitten Fragment der Ausnahmebedingungsnachricht - es war nicht in Englisch :) – Piotr

+2

versuchen Serialisierung des dynamischen Objekts zu einer Zeichenfolge mit Json. Wenn das fehlschlägt, serialisieren Sie das ganze verdammte Ding – Kell

Antwort

1

Grundsätzlich serialisieren Objekt als String JSON-Darstellung und zurück Inhalt Typ "Anwendung/JSON" gearbeitet.

Smth smth = new Smth() 
{ 
    Something = "dsfdsfdsfs" 
}; 
var serializer = new JavaScriptSerializer(); 
string json = serializer.Serialize(this.GetResponse(true, smth)); 
var response = this.Request.CreateResponse(HttpStatusCode.OK); 
response.Content = new StringContent(json, Encoding.UTF8, "application/json"); 
return response; 

Returns

{"is_success":true,"response_object":{"Something":"dsfdsfdsfs"},"messages":null} 
+0

Ich dachte nicht über ein Problem auf diese Weise nach. Vielen Dank! – Piotr