web-dev-qa-db-ja.com

C#でHTTPAcceptヘッダーとContent-Typeヘッダーの両方を「application / xml」に設定します

C#でWebサービス(REST)を作成しました。今、誰かがそれを使用するとき、ヘッダーに従ってJSONまたはXMLを返す必要があります。私はとても良いものを見つけました チュートリアルはこちら 。私はそれに従いましたが、それがどこにあるのかわかりませんset both the HTTP Accept and Content-Type headers to "application/xml"、私はそれをこのように呼んでいますhttp://localhost:38477/social/name。私の質問があなたにあまり明確でないならば、私はどんな質問にも答えることができますありがとうこれは私のコードです

[WebInvoke(UriTemplate = "{Name}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
        public MyclassData Get(string Name)
        {
            // Code to implement
            return value;

        }
7
user1391118

RESTfulサービスを構築するためにどのフレームワークを使用していますか(古いWCf Web Apiのように見えます)? Microsoftの新しいMVC4WebAPIを使用することを強くお勧めします。それは本当に成熟し始めており、RESTfulサービスの構築を大幅に簡素化します。これは、WCF WebAPIが廃止されようとしている将来のサポートになる予定です。

ModelClassを戻り値の型として返すだけで、リクエストのacceptヘッダーに応じてXMLまたはJSONに自動的にシリアル化されます。重複するコードを書くことを避け、あなたのサービスは幅広いクライアントをサポートします。

public class TwitterController : ApiController
{
     DataScrapperApi api = new DataScrapperApi();
     TwitterAndKloutData data = api.GetTwitterAndKloutData(screenName);
     return data;
}

public class TwitterAndKloutData
{
   // implement properties here
}

リンク

MVC4 2012RCのみをダウンロードしてMVC4Web Apiを入手することも、Visual Studio 2012RC全体をダウンロードすることもできます。

MVC 4: http://www.asp.net/mvc/mvc4

VS 2012: http://www.Microsoft.com/visualstudio/11/en-us/downloads


オリジナルのwcfweb apiについては、これを試してみてください。 acceptヘッダーを調べて、その値に従って応答を生成します。

var context = WebOperationContext.Current
string accept = context.IncomingRequest.Accept;
System.ServiceModel.Chanells.Message message = null;

if (accept == "application/json")
   message = context.CreateJsonResponse<TwitterAndCloutData>(data);
else if (accept == "text/xml")
   message = context.CreateXmlResponse<TwitterAndCloutData>(data);

return message;

リクエストが開始されたクライアントにacceptヘッダーを設定します。これは、リクエストの送信に使用しているクライアントのタイプによって異なりますが、どのhttpクライアントにもヘッダーを追加する方法があります。

WebClient client = new WebClient();
client.Headers.Add("accept", "text/xml");
client.DownloadString("domain.com/service");

使用する応答ヘッダーにアクセスするには

WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";

追加のリソース: http://dotnet.dzone.com/articles/wcf-rest-xml-json-or-both

5
Despertar

WebInvoke属性にRequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xmlを指定しました。これにより、リクエストとレスポンスの両方の形式がXmlに制限されます。 RequestFormatプロパティとResponseFormatプロパティを削除し、フレームワークがHttpヘッダーに基づいて動作するようにします。 Content-typeヘッダーはリクエストの本文タイプを指定し、Acceptヘッダーは応答ボディタイプ。

編集:

これは、フィドラーを使用してリクエストを送信する方法です。

enter image description here

Microsoft.HttpおよびMicrosoft.Http.Extensionsdllを使用できます。クライアント側のコードを書くための RESTスターターキット が付属しています。以下はサンプルです。

        var client = new HttpClient("http://localhost:38477/social");
        client.DefaultHeaders.Accept.AddString("application/xml");
        client.DefaultHeaders.ContentType = "application/xml";
        HttpResponseMessage responseMessage = client.Get("Twitter_name");
        var deserializedContent = responseMessage.Content.ReadAsDataContract<YourTypeHere>();
4
muruge