2

以前の "ASMX" Web サービス実装を使用してかなり複雑なアプリを作成しましたが、WCF に移行しています。私を夢中にさせていることが 1 つあります。簡単なはずですが、この呼び出しをどのように構成しようとしても、AJAX 呼び出しでエラーが発生します。これは、ASMX 呼び出しでは正常に機能しましたが、WCF では機能しませんでした。

AJAX 呼び出しは次のとおりです。

        var ProfileData = new Object();
        ProfileData.SUID = SUID;
        ProfileData.FirstName = $("#FirstName").val();
        ProfileData.LastName = $("#LastName").val();
        ProfileData.Birthdate = new Date($("#Birthdate").val());
        var DTO = {'ProfileData': ProfileData };

        $.ajax({
            type: "POST",
            url: "AllianceService.svc/SaveBasicProfile",
            data: JSON.stringify(DTO),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                    UpdateTips($("#BasicProfileValidate"), "Success! Your data has been updated.");
                }
            },
            error: function (xhr, ajaxOptions, thrownError, request, error) {
                alert('Error Saving Basic Profile Data');
            }
        });

C#/サーバー側での型の宣言は次のとおりです。

[DataContract]
public class BasicFolderData
{
    [DataMember]
    public string SUID { get; set; }
    [DataMember]
    public string FirstName { get; set; }
    [DataMember]
    public string LastName { get; set; }
    [DataMember]
    public DateTime Birthdate { get; set; }
}

サービスの定義は次のとおりです。

    [OperationContract]
    public int SaveBasicProfile(BasicFolderData ProfileData)
    {
         ... do stuff
    }

ここで、すべてのデータメンバーを分割してパラメーターとして使用すると、これを単純な方法で機能させることができます

    data: JSON.stringify(ProfileData)

しかし、オブジェクトは実際にはこれよりもずっと長いので、オブジェクトを渡す方法を知りたいです。

また、私は試しました:

    data: JSON.stringify({"ProfileData": ProfileData }),

    data: JSON.stringify('{"ProfileData":' + ProfileData + '}'),

    data: '{"ProfileData":' + JSON.stringify(ProfileData)  + '}',

しかし、すべて役に立ちません...それらすべてでエラーメッセージが表示されます。

私が使用する場合:

    data: JSON.stringify(ProfileData), 

次に、奇妙なことに、要求はサーバーに送信されますが、ProfileData パラメーターは null です。問題はデータ契約にあると思われますが、どこから始めればよいかわかりません。また、問題なく動作するスカラー パラメータを持つ多くの関数があります。失敗するのは、オブジェクトを渡そうとしたときだけです。どんな助けでも大歓迎です!!

DonAndre の提案に従って、パラメーターをスカラー型に変更するだけで呼び出しが成功することがわかりました。ただし、パラメーターは常に null です。

4

2 に答える 2

1

わかりました-問題は些細なことでした。「BasicFolderClass」にはDateTimeフィールド(Birthdate)が含まれていました。

JSON.stringifyがDTOオブジェクトで呼び出されると、JavaScript側のDateTimeフィールドが文字列に変換されてから送信されます。表示されているJSON文字列と予期されているDateTimeの間のそのフィールドの不一致が、エラーの原因です。

于 2012-10-18T00:56:49.547 に答える
1

dサーバーの構成でenableWebScriptがtrueに設定されている場合、WCFはJSONをaでラップします。ここを見てください:JsonConvert.DeserializeObjectとWCFの「d」ラッパー

于 2012-10-17T23:51:36.303 に答える