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: "
このリンクに遭遇しました 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を使用してそれを攻撃し、ディクショナリに/からシリアル化してビジネスロジックに渡します。それほどきれいではありませんが、機能的です。
私はこれを使用して動作します:
[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データとして渡されます。
リクエスト本文(フィドラーのリクエストビルダー内)に{"jsonstring": "Frank"}を入力してみましたか?
BodyStyle = WebMessageBodyStyle.WrappedRequest
に問題がある可能性があります。ドキュメントは完全に不明確ですが、要素がメソッド名でラップされることを期待しています。
ラップを解除し、リクエストの本文を'{"Name":"Frank"}'
に設定します(それを囲む単一引用符に注意してください。JSONを含む文字列を実際に投稿しているのは何ですか。なぜこれが必要なのかわかりません。それを思い出させます http://thedailywtf.com/Articles/XMLd-XML.aspx xmlをxmlに配置する場所JSONをJSONに配置します。