0

これは、この種のことをよく知っている人にとっては簡単なはずです。これは 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);
4

1 に答える 1

0

はい、xml でラップせずにプリミティブ データ型を送信することはできません。

エンドポイント動作のヘルプを有効にした後、完全なリクエスト構造を確認できます

webHttpBinding のエンドポイント名「api」があると仮定すると、次を使用してヘルプを有効にできます。

    < webHttp helpEnabled = "true " />

設定後、次のようなヘルプが表示されます

  http://localhost:<port>/test.svc/api/help

これにより、実際のリクエスト形式が表示されます。

文字列を渡すように、次のフォーマットラッパーを使用できます

  <string xmlns="http://schemas.microsoft.com/2003/10/ 
 Serialization/">Hello World</string> 

または、ストリーム入力パラメーターを使用できます

ストリーミングを実装するには、ここをクリックしてください

于 2013-04-12T18:18:16.303 に答える