7

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;

        }
4

3 に答える 3

5

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

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 Web Apiは、MVC4 2012 RCのみをダウンロードするか、Visual Studio2012RC全体をダウンロードすることで入手できます。

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

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


オリジナルのwcfwebapiについては、これを試してみてください。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

于 2012-07-08T17:45:30.267 に答える
4

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

編集:

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

ここに画像の説明を入力してください

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

        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>();
于 2012-07-08T18:05:51.273 に答える
-1

次のように、メソッドに2つのオーバーロードを作成できますか?

    [WebInvoke(UriTemplate = "dostuff", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    public StuffResponse DoStuff(RequestStuff requestStuff)


    [WebInvoke(UriTemplate = "dostuff", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
    public StuffResponse DoStuff(RequestStuff requestStuff)
于 2012-07-08T17:34:24.003 に答える