空の.net残りのapiは、XML
しか受け付けません。 コントローラメソッドが直接シリアル化したいクラスを返す場合、問題はありません。しかし、すべてのコントローラメソッドがHttpResponseMessage
を返すように、レスポンスラッパーを使用したいと思います。HttpResponseMessageはコンテンツをシリアル化できません
だから、この作品: FooController.cs:
public FooResponse PostFoo(FooRequest foo)
{
var fooVal = fooBll.GetFoo();
return new FooResponse { Foo = fooVal;};
}
しかし、これにはない: FooController.cs:
public HttpResponseMessage PostFoo(FooRequest foo)
{
var fooVal = fooBll.GetFoo();
HttpResponseMesage response;
response = fooBll.GetSuccessResponse(Url, new FooResponse {Foo = foovVal;});
return response ;
}
ResponseBLL.cs:
public HttpResponseMessage GetSuccessResponse(UrlHelper Url, object obj)
{
this.requestMsg = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage;
this.responseMsg = this.requestMsg.CreateResponse(HttpStatusCode.OK, obj);
this.responseMsg.Headers.Location = HttpContext.Current.Request.Url;
return this.responseMsg;
}
FooBLLが継承をResponseBLLだから私はfooBll.GetSuccessResponse
と呼ぶことができます。私が持っているWebApiConfig.csで
:私が得る
config.Formatters.XmlFormatter.UseXmlSerializer = true;
config.Formatters.Remove(config.Formatters.JsonFormatter);
エラーは、型FooResponseが期待されていなかった
です。静的に認識されない型を指定するには、XmlIncludeまたは SoapInclude属性を使用します。
私はすでにこの問題に関してたくさんの質問があり、私を信頼していることを知っています。私はすべて成功していません。私は考えることができるすべての可能な組み合わせで[DataContract], [DataMember], [Serializable]
と[XmlInclude]
属性を試しました。 FooBLLクラスの[XmlInclude(typeof(FooResponse))]
、ResponseBLLの[XmlInclude(typeof(FooBLL))]
などがあります。
私があなたを助けてくれることを願っています。
アクションフィルタ –
@AlekseyLを使用してこの豊かな王をする方がはるかにクリーンです。ありがとう、私はそれを調べます。基本的に、なぜこのラッパーは、コントローラがさまざまなタイプのコンテンツを返すことができるからです。 'GetFailResponse'メソッドもあります。これは、コンテンツの代わりにエラーに関する情報を返します。それがなければ、私が見る限り、私はそれをすることはできません、私は 'FooResponse'と他のものを返す必要があります。 – John
これは例外フィルタまたは例外ハンドラによって処理されます –