これは、この種のことをよく知っている人にとっては簡単なはずです。これは 1 つのバリエーション (フィドラー) で機能するため、提供するコードの範囲を制限します。
この問題は簡単に説明できます。文字列をパラメーターとして受け取るメソッドが WCF にあります。このメソッドは、ボディ スタイルがラップされたリクエストを想定しています。フィドラーで単純なオブジェクトを作成して送信すると、機能します。{"submission":"something"} のようなもの。JSONでajax経由でこれを行うと、機能しません。許可されていないという不正なリクエストエラーが表示されます...これはクロスドメインですが、これは問題ではありません。これを処理するためにメソッドに適切なヘッダーを追加します。この場合、メソッドが呼び出されることはありません (署名の問題のようです)。
ただし、これが問題です...文字列の1つのプロパティを持つ本当に単純なクラスを作成し、オブジェクトを渡すと、正常に機能します。ラップされた body スタイルでオブジェクトを渡すことは正常に機能します。文字列などの「プリミティブ型」でこれを実行しようとしても...アイデアはありませんか?
これは機能しません(ただし、フィドラーを介して機能します)....
var datain = new Object();
datain.submission = "mysubmission";
var dataToSend2 = JSON.stringify(datain);
$.ajax({
type: "POST",
url: "http://localhost:8000/ServiceModelSamples/Service/rest/Reflect",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: dataToSend2,
success: function (item) {
debugger;
alert(item);
},
error: function (xhr) {
debugger;
alert(xhr);
}
});
この契約で....
[OperationContract]
[WebInvoke(Method = "*",
RequestFormat = WebMessageFormat.Json,
BodyStyle=WebMessageBodyStyle.WrappedRequest)]
string Reflect(String submission);
これは機能します....
var spec = new Object();
spec.submission = "mysubmission";
var dataToSend3 = '{"thespecial":' + JSON.stringify(spec) + '}';
$.ajax({
type: "POST",
url: "http://localhost:8000/ServiceModelSamples/Service/rest/Reflecting",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: dataToSend3,
success: function (item) {
debugger;
alert(item);
},
error: function (xhr) {
debugger;
alert(xhr);
}
});
この契約で...
[OperationContract]
[WebInvoke(Method = "*",
RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string Reflecting(Special thespecial);