0

オブジェクトをシリアル化するために JavaScriptSerializer を使用しています。そして、例外をシリアル化するときに問題が発生しました。または、ファイルパスの改行文字とバックスラッシュが含まれているため、シリアル化された例外を逆シリアル化する場合。(論争は別の機会にしましょう)。

その問題を克服するために、次のような「js エンコーディング」拡張メソッドを実行しました。

https://stackoverflow.com/a/2680805/385926

しかし、Asp.Net WebMethods は JSON に自動的にシリアル化され、追加のプログラミングなしで例外が適切にシリアル化されることはわかっています。

では、asp.net は、JSON にシリアル化するときに、これらの特殊な char ケースをどのように処理するのでしょうか? それを処理するクラスまたはメソッドはありますか?私の拡張メソッドとその JsEncoding メソッドは、.Net に既に存在するものに対して冗長ではありませんか?

前もって感謝します。

編集:

要求されたコード。私は aspx ページを持っています:

protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "application/json";
    var serializer = new JavaScriptSerializer();

    try
    {
        // do the file manipulation and registering
        Process();

        Response.Clear();
        Response.Write(serializer.Serialize(new
        {
            d = true
        }));
    }
    catch (Exception ex)
    {   
        Response.Clear();
        Response.Write(serializer.Serialize(new
        {
            Message = ex.Message,
            ExceptionType = ex.GetType().ToString(),
            StackTrace = ex.StackTrace
        }));
    }

}

いくつかの例外がある場合、JSON.parse でデシリアライズできません (実際、これが jQuery 内にあるのか、ブラウザーに組み込まれているのかはわかりません)。JSON.parse は、(\n 文字列ではなく) 改行文字とその他の特殊文字があるため、例外をスローします。たとえば、次の例外を解析しようとします (そして失敗します)。

{"Message":"User not authenticated.","ExceptionType":"System.Exception","StackTrace":" at MyWebTest.MySite.Process() in C:\Solutions\MyWebTest\MySite.aspx.cs:line 100
at MyWebTest.MySite.Page_Load(Object sender, EventArgs e) in C:\Solutions\MyWebTest\MySite\.aspx.cs:line 60"}

代わりに、次を返す必要があります (正しく解析されるため)。

{"Message":"User not authenticated.","ExceptionType":"System.Exception","StackTrace":" at MyWebTest.MySite.Process() in C:\\\\Solutions\\\\\MyWebTest\\\\MySite.aspx.cs:line 100\\r\\n at MyWebTest.MySite.Page_Load(Object sender, EventArgs e) in C:\\\\Solutions\\\\MyWebTest\\\\MySite.aspx.cs:line 60"}

そこで、置換を行う拡張メソッドを作成しました。コードは次のように変更されます。

new
{
    Message = ex.Message.JsEncode(),
    ExceptionType = ex.GetType().ToString(),
    StackTrace = ex.StackTrace.JsEncode()
}));
4

1 に答える 1