2012-03-06 18 views
2

私はASP.NET MVC4 Web APIでAPIを構築していますが、私のアクションの1つはXML(現在はXElementの形式)を返します。私はデータのコントロールがありません、私はそれを渡すだけです。それをデシリアライズできる標準オブジェクトはありません。ASP.NET MVC4 Web API XElementをJSONに変換するMediaTypeFormatterコンバータ

public Task<XElement> Get(string queryName, string query)... 

私がしたいことは、MediaTypeFormatterを使用して、そのように要求された場合にMediaTypeFormatterをJSONに変換することです。私はMediaTypeFormatterを書き始めて、それをフックアップが、私は、コントローラの「ゲット」を呼び出すとき、それはMediaTypeFormatterで

protected override bool CanWriteType(Type type) 
{ 
    return true; 
} 

を呼び出しますが、限りOnWriteToStreamAsync方法として取得することがありません。結果は文字列としてのXMLだけです。

"<testXmlHere\/>" 

これを修正する方法はありますか?ここで

おかげ

+0

あなたのAPIはなぜタスクを返すのですか? – cecilphillip

+0

これは非同期実行を有効にするためです。多くの記事がありますが、スタック全体が非同期実行用に設計されています。 –

答えて

2

カスタムフォーマッタは、フォーマッタコレクションのJsonMediaTypeFormatterの後にフォーマッタリストに挿入されている可能性があります。そのフォーマッタはXElementと書くことができます。また、XML表現をJSON文字列として書き込むこともできます(これは良いか悪いかを問わず)。

GlobalConfiguration.Configuration.Formatters.Insert(
    0, new MyCustomMediaTypeFormatter()); 
+0

ありがとう...とてもシンプルです。 –

0

は、まずHttpResonponseメッセージを作成し、あなたが取得しているものは何でもデータにコンテンツを設定...野生の提案です。カスタムアクションフィルタ(System.Web.HttpFilters.ActionFilterAttribute)を作成し、OnActionExecutedメソッドを実装してみてください。

メソッドで、それぞれのHttpRequestオブジェクトとHttpResponseオブジェクトをHttpActionExecutedContextから取得します。 HttpRequestのAcceptヘッダーとHttpResponseのデータを取得できます。必要に応じて、リクエストの受け入れヘッダーに基づいてデータをフォーマットし、それをレスポンスのコンテンツに再割り当てします。

あなたはどこから来ていますか?

0
public HttpResponseMessage<SensorUpdate> Post(int id) 
    { 
     SensorUpdate su = new SensorUpdate(); 
     su.Id = 12345;    
     su.Username = "SensorUpdateUsername"; 
     su.Text = "SensorUpdateText"; 
     su.Published = DateTime.Now; 


     HttpResponseMessage<SensorUpdate> response = new HttpResponseMessage<SensorUpdate>(su, 
        new MediaTypeHeaderValue("application/json")); 

     return response; 
    } 
+0

Fyi - HttpResponseMessage オブジェクトは推奨されていません – rboarman

0

MVC4クイックヒントグローバルでのASP.NetのWeb API

から#3 - 削除するXMLのフォーマッタ:コレクションにあなたのフォーマッタを追加する場合は、代わりにAdd方法のInsertを使用しています。 asax:そのような

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 

の行を追加します。
 protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     BundleTable.Bundles.RegisterTemplateBundles(); 
     GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 
    } 
関連する問題