捕获Nancy

时间:2017-08-11 09:13:51

标签: asp.net .net xmlserializer nancy

修改: Issue on GitHub here

第一次与Nancy一起玩,并编写了这个简单的端点来测试基于Accept标题的内容协商:

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

使用Postman,我设置Accept: application/json,结果与预期一致,而Accept: text/xml生成文字:

  

生成XML文档时出错

经过一些试验和错误后,我发现这是由匿名类型引起的,这是一个与XmlSerializer有关的单独问题。但是,我无法弄清楚如何在任何地方捕获此序列化错误。它就像它吞下了#34;南希或ASP.NET的某个地方。上述消息将作为文本返回给请求者,状态代码为 200 OK

尽管设置了Visual Studio来打破所有异常以及连接到pipelines.OnErrorApplication_OnError,但我没有发现错误的迹象。我不确定这是一般的序列化程序,ASP.NET还是Nancy的问题(​​或者如果我错过了一些明显的东西)。

// 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);
}

为什么不会抛出/捕获此错误?

1 个答案:

答案 0 :(得分:2)

Nancy使用.Net XmlSerializer进行XML序列化。并且.Net XmlSerliazer无法序列化匿名类型:

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

  

Nancy使用.NET Framework自带的内置XmlSerializer   处理客户端使用XML发送和接收数据的基础结构   作为传输格式。

Can I serialize Anonymous Types as xml?

  

对不起,你不能。 XML Serializer几乎只是序列化了公共读写类型。

你需要像这样返回一个POCO(Plain-Old-CSharp-Object)

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

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

或实施其他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中关闭Just-My-Code来解决此问题。您可以通过以下步骤执行此操作:

Debug->Options然后取消选中Just-My-Code

enter image description here

然后转到Debug->Windows-Exception Settings (Ctrl+Alt+E)。检查Common Language Runtime Exceptions

enter image description here