web-dev-qa-db-ja.com

WCF REST Service JSON Post data

VS2010のWCF RESTテンプレート40(CS)拡張に基づく、WCF 4 RESTサービスに関するガイダンスを探しています。私はこの数日間、このバッガーを動作させるために他の投稿をレビューするために費やしてきましたが、近づいてきましたが、フィニッシュラインを超えられないようです。いらいらした後、最終的にサービスにアクセスして(fiddlerリクエストビルダーを使用して)ポストしますが、メソッドパラメーターはnullとして出てきますが、リクエストビルダーで適切に設定されています。現時点では構成の問題の可能性があると思いますが、締め切りが迫っているので、より多くの調査を行う時間が不足しています。 FWIW、デバッグでは、jsonstring変数はnullです。これは私にとって初めてRESTを使用する初めての質問であることは間違いありません。どんな助けでも大歓迎です!

前もって感謝します。

web.config

<system.web>
  '<compilation debug="true" targetFramework="4.0" />
</system.web>

<system.webServer>
 <modules runAllManagedModulesForAllRequests="true">
   <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
 </modules>
</system.webServer>

<system.serviceModel>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
 <standardEndpoints>
   <webHttpEndpoint>
     <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
   </webHttpEndpoint>
 </standardEndpoints>
</system.serviceModel>

global.asax.cs

   public class Global : HttpApplication
  {
      void Application_Start(object sender, EventArgs e)
      {
         RegisterRoutes();
      }

      private void RegisterRoutes()
      {
         RouteTable.Routes.Add(new ServiceRoute("Scoring", new WebServiceHostFactory(), typeof(ScoringSvc)));
      }
   }

サービスコード

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class ScoringSvc 
{
   [OperationContract]
   [WebInvoke
      (Method = "POST",
      BodyStyle = WebMessageBodyStyle.WrappedRequest,
      RequestFormat=WebMessageFormat.Json,
      ResponseFormat=WebMessageFormat.Json)]
   public string BOB(string jsonstring)
   {
      return "Received: " + jsonstring;
   }
}

Fiddlerリクエストヘッダー

Host: localhost
Content-Length: 20
Content-Type: application/json; charset=UTF-8

リクエストボディ

{"Name":"Frank"}

バイオリン弾きからの生の反応

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 12
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 21 Mar 2011 21:31:14 GMT

"Received: "
11
Grogh

このリンクに遭遇しました WCF + REST:Where is the request data? そして、ストリームをメソッドに渡し、それをストリームリーダーで文字列にリッピングしてフォームポストデータを取得するGlennの応答を確認しました。

プロトタイプサービスコードを次のように変更しました

[OperationContract]
[WebInvoke
   (UriTemplate="/BOB",
    Method = "POST",
    BodyStyle = WebMessageBodyStyle.WrappedRequest)]
public string BOB (Stream streamdata)
{
    StreamReader reader = new StreamReader(streamdata);
    string res = reader.ReadToEnd();
    reader.Close();
    reader.Dispose();
    return "Received: " + res;
}

そしてそれはトリックを行うようです、完全なjson配列がストリームで渡され、ローカル文字列に読み込まれます。次に、json.netを使用してそれを攻撃し、ディクショナリに/からシリアル化してビジネスロジックに渡します。それほどきれいではありませんが、機能的です。

20
Grogh

私はこれを使用して動作します:

[WebInvoke(ResponseFormat = WebMessageFormat.Json, 
           RequestFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.WrappedRequest,
           Method = "POST",
           UriTemplate = "setExpositions?shelfId={shelfId}")]
[OperationContract]
public bool SetExpositions(int shelfId, List<WcfExposition> expositions)
{
}

ここで、shelfIdはGETで渡され、説明はメッセージ本文でJSONデータとして渡されます。

3
Christian

リクエスト本文(フィドラーのリクエストビルダー内)に{"jsonstring": "Frank"}を入力してみましたか?

2
Lei Shi

BodyStyle = WebMessageBodyStyle.WrappedRequestに問題がある可能性があります。ドキュメントは完全に不明確ですが、要素がメソッド名でラップされることを期待しています。

ラップを解除し、リクエストの本文を'{"Name":"Frank"}'に設定します(それを囲む単一引用符に注意してください。JSONを含む文字列を実際に投稿しているのは何ですか。なぜこれが必要なのかわかりません。それを思い出させます http://thedailywtf.com/Articles/XMLd-XML.aspx xmlをxmlに配置する場所JSONをJSONに配置します。

0
Martijn