2017-08-11 8 views
1

編集:Issue on GitHub hereナンシーのシリアル化エラーのキャプチャ


初めてナンシーで遊んとAcceptヘッダーに基づいてコンテンツネゴシエーションをテストする場合は、このシンプルなエンドポイント書いた:Postmanを使用して

public HomeModule() 
{ 
    Get["/"] = _ => new { Foo = "Bar" }; 
} 

を、私はAccept: application/jsonを設定し、期待通りの結果があり、しばらくAccept: text/xmlテキストを得られます。

XMLドキュメント

を生成するときにエラーが発生しました

いくつか試行錯誤した結果、これは匿名型が原因であることが判明しました。これはXmlSerializerに関する別の問題です。しかし、私はどのようにこのシリアライゼーションエラーをキャプチャするのか把握できません。それは、ナンシーやASP.NETのどこかで "飲み込まれた"ようなものです。上記のメッセージは、ステータスコード200 OKを含むリクエスタにテキストとして返されます。

上のすべてのの例外を破るだけでなく、pipelines.OnErrorApplication_OnErrorにフックアップするためのセットアップのVisual Studioにもかかわらず、私はエラーが発生したという兆候を取得していません。私はこれが一般的なシリアライザ、ASP.NETまたはナンシーの問題であるかどうかは不明です(または明らかに何かが分からない場合)。

// in bootstrapper's ApplicationStartup method: 

pipelines.OnError += (ctx, ex) => { 
    System.Diagnostics.Trace.WriteLine(ex?.ToString()); // doesn't fire 
    return null; 
}; 

// in Global.asax: 

protected void Application_Error(object sender, EventArgs e) 
{ 
    var err = Server.GetLastError(); 
    System.Diagnostics.Trace.WriteLine(err?.Message); 
} 

このエラーはなぜ投げられないのですか?

答えて

2

ナンシーは.Net XmlSerializerをXMLシリアル化に使用します。そして、.NET XmlSerliazerは、匿名型をシリアル化することはできません。

https://github.com/NancyFx/Nancy/wiki/Extending-Serialization-with-Converters

ナンシーは、クライアントが送信すると、トランスポート・フォーマットとしてXML を使用してデータを受信処理するために、.NET Frameworkの独自のビルトインのXmlSerializer インフラストラクチャを使用しています。

Can I serialize Anonymous Types as xml?

申し訳ありませんが、あなたがすることはできません。 XMLシリアライザは、パブリックの読み書きタイプをシリアライズするだけです。

あなたはどちらか、この

public class HomeModule:NancyModule 
{ 
    public class FooModel 
    { 
     public string Foo { get; set; } 
    } 

    public HomeApi() 
    { 
     Get("/", p => 
     { 
      var r = new F { Foo = "Bar" }; 
      return r; 
     }); 
    } 
} 

ようPOCO(プレーンオールド-CSHARP-Object)を返すか、別のXmlSerialiser

https://github.com/NancyFx/Nancy/wiki/Extending-Serialization-with-Converters

の設計を実装する必要があります

XmlSerializerはかなり拡張可能な であり、拡張可能な方法はとは異なりますJavaScriptConverterおよびJavaScriptPrimitiveConverterのタイプには、 JSONのシリアル化が使用されます。 XmlSerializerはJSON コンバーターを認識せず、JavaScriptSerializerはXML固有の属性を無視します。 したがって、XMLシリアル化とJSONシリアライゼーションの拡張は、互いに干渉することなく同じプロジェクト内に共存することができます( )。

ナンシーの内部構造に基づいています。 Serialiserからのエラーメッセージが出力に書き込まれます。具体的にはThere was an error generating the XML document.です。しかし、例外の詳細はどこにも書かれていません。エラーを見るために

https://github.com/NancyFx/Nancy/blob/master/src/Nancy/Responses/DefaultXmlSerializer.cs

catch (Exception exception) 
{ 
    if (this.traceConfiguration.DisplayErrorTraces) 
    { 
     var bytes = Encoding.UTF8.GetBytes(exception.Message); 
     outputStream.Write(bytes, 0, exception.Message.Length); 
    } 
} 

は、Visual Studioでジャスト・マイ・コードをオフにすることによってそれを回避する必要があります。

enter image description here

、その後のチェックを外しJust-My-Code

Debug->OptionsとをそしてDebug->Windows-Exception Settings (Ctrl+Alt+E)に行く:あなたは、次の手順でこれを行うことができます。 、ジェフに答えるためCommon Language Runtime Exceptions

enter image description here

+0

感謝を確認してください。私は、XmlSerializerがシリアライゼーションに関する原因であることを認識しており、修正は簡単です。私の質問は、エラーが200 OK応答の後ろに隠れているという事実に関係しています。私はどこかでエラーを捕捉/記録できると予想していたでしょう。あなたはこれについていくつかの光を当てることができますか? – bernhof

+0

ありがとうございます。*エラーはありますが、DefaultXmlSerializerによって隠されています。なぜこれがなぜだろうかと思っています。繰り返しますが、このようなエラーが発生すると** 200 OK **の応答は期待できませんが、これをGitHubで問題を提起します。乾杯! – bernhof

関連する問題