代码之家  ›  专栏  ›  技术社区  ›  bernhof

在Nancy中捕获序列化错误

  •  1
  • bernhof  · 技术社区  · 7 年前

    编辑: Issue on GitHub here


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

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

    Postman ,我设置 Accept: application/json 结果如预期,而 Accept: text/xml 生成文本:

    生成XML文档时出错

    .

    尽管已经安装了Visual Studio以打开 例外情况以及连接到 pipelines.OnError Application_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 回复  |  直到 7 年前
        1
  •  2
  •   Joe coqem2    7 年前

    Nancy使用.Net XmlSerializer XmlSerliazer 无法序列化匿名类型:

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

    Nancy使用.NET Framework自己的内置XmlSerializer 使用XML处理客户端发送和接收数据的基础结构

    Can I serialize Anonymous Types as xml?

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

    您需要像这样返回POCO(普通的旧CSharp对象)

    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的属性。 在同一个项目中共存,互不干扰。

    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中仅关闭我的代码来解决它。您可以通过以下步骤完成此操作:

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

    enter image description here

    Debug->Windows-Exception Settings (Ctrl+Alt+E) 检查 Common Language Runtime Exceptions

    enter image description here