2017-10-29 14 views
1

数日から、Web APIの汎用レスポンスから1つのプロパティが動的にポイントするタイプのラッパークラスを返す方法を理解しようとしています。コード片の下c#Web Api - すべてのAPI応答の汎用ラッパークラス

は私が達成したいものを示しています

[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 
     }; 
    } 
} 

残念ながらこのapporachは動作しません - 私はまだ取得:

ExceptionMessage

はタイプ<のserailizationを実行できません> f__AnonymousType0` 3 [System.Boolean、System.Object、System.String []] ...

ExceptionType

System.Runtime.Serialization.InvalidDataContractException

のStackTrace

System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(文字列メッセージ、タイプtype)でSystem.Runtime.Serialization.DataContract.DataContractCriticalHelper wです。 System.Runtime.Serialization.DataContractSerializer.GetDataContract(DataContract declaredTypeContract、型宣言型、型宣言)System.Runtime.Serialization.DataContractSerializer.GetDataContract(Int32 id、RuntimeTypeHandle typeHandle、Type型)タイプobjectType)w System.Runtime.Seria (XmlWriterDelegatorライター、オブジェクトグラフ、DataContractResolver dataContractResolver)System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer、Object)グラフ、DataContractResolver dataContractResolver)System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriterライター、オブジェクトグラフ)System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream(型の型、オブジェクトの値、ストリームのwriteStream、HttpContentの内容)。 Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(型の型、オブジェクトの値、ストリームのwriteStream、HttpContentのコンテンツ、TransportContextのtransportContext、CancellationTokenのcancellationToken)--- System.RuntiでのWikiの読み込みme.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスクタスク)w System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスクタスク)System.Net.Http.HttpContent.d__49.MoveNext()--- Koniecメッセージを送信しました。 (タスクタスク)System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスクタスク)System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスクタスク)System.Web.Http.Owin.HttpMessageHandlerAdapter.d__13.MoveNext()System.Web.Http.Owner.HttpMessageHandlerAdapter.d__13.MoveNext私の研究の間に

は私も仕事フォーラムいくつかの例で見つかった:上記の例

[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); 
    } 
} 

が動作し、正しくフォーマットされたデータを返しますが、そのようなpproachは命名に関連するバグを引き起こします(このように、私が返すたびに応答構造を指定しなければなりません)。

私の観点からは、最初のケースでは匿名型を取得し、2番目のケースではオブジェクトで作業するという点を除いて、この2つのアプローチに違いはありません。

は、そこで質問です:

それは私の最初のアプローチを動作させることは可能ですか?

+0

を得ていますか? – derloopkat

+0

例外の詳細を追加しましたが、例外メッセージの断片を切り捨てました - 英語ではありませんでした:) – Piotr

+2

jsonを使用して動的オブジェクトを文字列にシリアル化しようとしました。それが失敗した場合は、全部のものをシリアル化してください。 – Kell

答えて

1

オブジェクトを文字列json表現として基本的にシリアル化し、コンテンツタイプ "application/json"を返します。あなたはどのようなエラーを

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; 

戻り

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

私はこのような問題については考えなかった。ありがとうございました! – Piotr

関連する問題