2012-07-26 27 views
31

WEB APIメソッドを呼び出して、呼び出し元のアプリケーションにXMLオブジェクトを返すようにしたいと思います。現在、XMLを文字列オブジェクトとして返すだけです。これはいいですか?もしそうなら、webapi getメソッドに、XML型のオブジェクトを返すことを教えてください。XMLを返すWebAPI

編集

ありがとう:Getメソッドの例:

[AcceptVerbs("GET")] 
public HttpResponseMessage Get(int tenantID, string dataType, string ActionName) 
{ 
    List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData 
      ("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList(); 
    string AllResults = ""; 
    for (int i = 0; i < SQLResult.Count - 1; i++) 
    { 
     AllResults += SQLResult[i]; 
    } 
    string sSyncData = "<?xml version=\"1.0\"?> " + AllResults; 
    HttpResponseMessage response = new HttpResponseMessage(); 
    response.Content = new StringContent(sSyncData); 
    return response;   
} 

そのビットハックので、試作段階ではまだイム。私はその実力を証明することができます。

答えて

28

シリアライズ可能なオブジェクトを返すと、WebAPIはクライアントが送信するAcceptヘッダーに基づいてJSONまたはXMLを自動的に送信します。

文字列を返すと文字列が返されます。

+0

こんにちはすべて、メソッドが返すデータは動的です。状況A.はエンティティのリストを返す。状況Bは、2つ以上のエンティティ/クラスの組み合わせのリストであり得る。私はそれを動的にするつもりですが、xmlを返すようにWebAPIを欺くことを望んでいます(JSON形式を返すこともできますが、XMLは主に必要です) – Matt

+0

次に、必要なデータを含むことができる、それ。 –

+2

オブジェクトに[Serializable()]を指定していることを確認してください。最初はこれを見逃しました。 –

14

オブジェクトを返すだけで、XMLまたはJSONのどちらかを心配する必要はありません。 Web APIからJSONまたはXMLをリクエストするのはクライアントの責任です。たとえば、Internet Explorerを使用して呼び出しを行うと、要求されるデフォルトの形式はJsonになり、Web APIはJsonを返します。しかし、Google Chromeを使用してリクエストを行うと、デフォルトのリクエスト形式はXMLであり、XMLを返すことになります。

Fiddlerを使用してリクエストを行う場合は、AcceptヘッダーをJsonまたはXMLのいずれかに指定できます。

Accept: application/xml 

あなたはこの記事を参照したいことがあります。Content Negotiation in ASP.NET MVC4 Web API Beta – Part 1

編集:コードを使用して編集した質問に基づいて:文字列の

シンプルなリターンリスト、代わりにXMLに変換します。フィドラーを使って試してみてください。例えば

public List<string> Get(int tenantID, string dataType, string ActionName) 
    { 
     List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList(); 
     return SQLResult; 
    } 

あなたのリストが似ている場合:

List<string> list = new List<string>(); 
list.Add("Test1"); 
list.Add("Test2"); 
list.Add("Test3"); 
return list; 

、あなたは出力されますAccept: application/xmlを指定:

<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <string>Test1</string> 
    <string>Test2</string> 
    <string>Test3</string> 
</ArrayOfstring> 

と、指定した場合は '同意する:アプリケーション/ JSONを' に要求は次に出力されます:

[ 
    "Test1", 
    "Test2", 
    "Test3" 
] 

カスタマイズされたxmlを送信するのではなく、クライアントがコンテンツタイプを要求するようにします。

+0

だから、現在、私はカスタム構築していますAPIのXMLは、ちょうど結びつきのある文字列であり、その文字列を返すよりも、メソッドを取得します。だからそれ以外のことは何もしなくてはなりませんか? – Matt

+0

voltagexの投稿 – Matt

+0

@Ravenに添付されたコメントを読んでください。あなたのメソッドシグネチャまたは関連するC#コードの一部を質問に投稿してください。 – Habib

62

戻り値のオブジェクト型をコントローラが決定しないようにするには、戻り値の型をSystem.Net.Http.HttpResponseMessageと設定し、以下のコードを使用してXMLを返します。

public HttpResponseMessage Authenticate() 
{ 
    //process the request 
    ......... 

    string XML="<note><body>Message content</body></note>"; 
    return new HttpResponseMessage() 
    { 
    Content = new StringContent(XML, Encoding.UTF8, "application/xml") 
    }; 
} 

これは、Web APIから常にXMLを返すための最も簡単な方法です。

+9

あまりにもしばしば人々はスマートであると答えます。私は答えを簡単にして、手元の問題に直接対処してほしい。私はXMLで文字列を持っています。私はXMLを返す。ビンゴ!この回答に感謝します。 – Kevin

18

IHttpActionResult戻り値の型と互換性がある別の方法があります。この場合、私が代わりにデータ契約・シリアライザのXMLシリアライザ(別売)を使用することを求めています、私はreturn ResponseMessage(を使用しています私はIHttpActionResultと互換性のリターンを得るように:

return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK) 
     { 
      Content = new ObjectContent<SomeType>(objectToSerialize, 
       new System.Net.Http.Formatting.XmlMediaTypeFormatter { 
        UseXmlSerializer = true 
       }) 
     }); 
+0

それはまさに私が探していた方法です。ありがとうございますAaronLS – Shahdat

+1

素晴らしい答え、ありがとう。 'SomeType'にデフォルトのコンストラクタがあることを確認するか、役に立たないエラーが発生する*" ...設定されたformatter 'System.Web.Http.Tracing.Tracers.XmlMediaTypeFormatterTracer'は型のオブジェクトを書き込めません "* – Dunc

+2

'Content(System.Net.HttpStatusCode.OK、model、Configuration.Formatters.XmlFormatter)'と書くだけです。 – kokosda

関連する問題