0

クライアントとサーバー間でJSONを送信するASP.NETWebアプリケーションを作成しています。クライアントからASMXにJSONを送信して、それを他のものとして解釈させることができないように見えることを除いて、ほぼすべてが完了しています。Dictionary<string>

サーバー側では、

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class WebService1: System.Web.Services.WebService
{
    [WebMethod(EnableSession = true)]
    public bool SaveExpression(ExpressionStructure Expression) {
        return true;
    }
}

クライアント側では、を使用してデータを送信しています$.ajax()。ここで、はクライアントが以前に受信したexpressionObject.expression.NETクラスのオブジェクトです。ExpressionStructure

var dataSubmit = { Expression: expressionObject.expression };
$.ajax({
    url: "WebService.asmx/SaveExpression",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    type: 'POST',
    data: JSON.stringify(dataSubmit),
    success: function (msg) {
        alert(msg.d);
    },
    error: function (obj, status, msg) { ajaxServerError(obj, status, msg); }
});

SaveExpressionメソッドがを受け入れると、Object文字列の辞書を取得します。を使用するExpressionStructureと、が表示され500 Internal Server Errorます。

送信される式は、このMVC3コントローラーメソッドから受信されるものの変更されていないバージョンです。

public ActionResult Expression(int ExpressionID) {
    ExpressionStructure es = GetExpressionFromDatabase(ExpressionID);

    return new JsonResult {
        Data = new {
            expression = es,
            view = this.RenderPartialView("_Expression_Statement", es)
        }, 
        JsonRequestBehavior = System.Web.Mvc.JsonRequestBehavior.AllowGet
    };
}

式自体は次のようになります。

{
    "Expression": 
    {
        "Name":"Status Desc",
        "Type":0,
        "Statement": 
        {
            "FormulaItem": 
            {
                "Type":"Replace",
                "Parameters": 
                [
                    {
                        "Type":"Char",
                        "Value": 
                        {
                            "Value":"[Status]"
                        },
                        "Source":"picker"
                    },
                    {
                        "Type":"input",
                        "Value":
                        {
                            "Value":"0,1,2;Home,Driving,Away"
                        },
                        "Source":"inputBox"
                    }
                ]
            }
        }
    }
}

ASMXメソッドを取るように変更しようとしましたstringExpressionStructure、どちらも。を返します500 Internal Server Error。また、クライアントからのJSONを変更して、さまざまなラッピング(最も外側"Expression"の角かっこでのラッピングを含む)を実行してみました。

ASMXがJSONを正しく取得して取得するのを妨げている、欠落している重要な要素は何ExpressionStructureですか? オプションで、文字列を直接または辞書から取得して、JSON変換を手動で実行できるようにするにはどうすればよいですか(これは実行したくないです)。

4

1 に答える 1

0

メインプロジェクトとは別に小さなテストケースを作成した後、サーバーが戻ってきた理由についてより良い情報を得ることができました500 Internal Server Error。たまたま、Webアプリは逆シリアル化エラーをキャッチし、要求をエラーハンドラーページにリダイレクトしようとしていました。これは実際のページリクエストではなかったため、リダイレクトによってエラーがスローされ、エラーハンドラページへのリダイレクトが強制されました。リダイレクトが多すぎるとエラーが発生しました。

根本的な問題は、JSONを.NET側のかなり複雑な(コレクションの)クラスに逆シリアル化することでした。XML属性デコレータで完全に装飾されたクラスは、スキーマに選択肢がある場合(つまり、1つの要素または別の要素)に抽象クラスを使用していました。同様のJSONデコレータがないと、逆シリアル化はJSONをどのクラスに逆シリアル化するかを知りませんでした。

于 2012-08-09T21:00:20.077 に答える