Asp.net 在Nancy中捕获序列化错误

Asp.net 在Nancy中捕获序列化错误,asp.net,.net,xmlserializer,nancy,Asp.net,.net,Xmlserializer,Nancy,编辑: 第一次与Nancy玩游戏,并编写了这个简单的端点来测试基于Accept标题的内容协商: public HomeModule() { Get["/"] = _ => new { Foo = "Bar" }; } 使用,我设置了Accept:application/json,结果与预期一致,而Accept:text/xml生成以下文本: 生成XML文档时出错 经过一些尝试和错误,我发现这是由匿名类型引起的,这是关于XmlSerializer的另一个问题。但是,我不知道如何在

编辑:


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

public HomeModule()
{
    Get["/"] = _ => new { Foo = "Bar" };
}
使用,我设置了
Accept:application/json
,结果与预期一致,而
Accept:text/xml
生成以下文本:

生成XML文档时出错

经过一些尝试和错误,我发现这是由匿名类型引起的,这是关于XmlSerializer的另一个问题。但是,我不知道如何在任何地方捕获此序列化错误。这就像是在Nancy或ASP.NET中的某个地方被“吞没”。上述消息以文本形式返回给请求者,状态代码200 OK

尽管已将Visual Studio设置为断开所有异常,并连接到
管道.OnError
应用程序OnError
,但我没有发现发生错误的迹象。我不确定这是否是一般序列化程序ASP.NET或Nancy的问题(或者如果我遗漏了一些明显的东西)


为什么这个错误不能抛出/捕获?

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

Nancy使用.NET Framework自己的内置XmlSerializer 使用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

XmlSerializer的设计非常简单 可扩展,并且它的扩展方式与 JavaScriptConverter和JavaScriptPrimitiveConverter类型 JSON序列化使用。XmlSerializer不知道JSON 转换器和JavaScriptSerializer忽略特定于XML的属性。 因此,可以对XML序列化和JSON序列化进行扩展 在同一项目中共存而不相互干扰

基于南希的内部结构。Serialiser的错误消息被写入输出,即生成XML文档时出错。。但例外情况的细节并没有写在任何地方

为了查看错误,您需要通过在VisualStudio中仅关闭“我的代码”来解决它。可以通过以下步骤执行此操作:

Debug->Options
,然后取消选中“仅我的代码”

然后转到
调试->Windows异常设置(Ctrl+Alt+E)
。检查
公共语言运行时异常


谢谢你的回答,杰夫。我意识到XmlSerializer是序列化的罪魁祸首,修复起来很容易。我的问题涉及这样一个事实,即错误隐藏在200 OK响应后面,我觉得这很奇怪。我本来希望能够在某个地方捕获/记录错误。你能解释一下吗?谢谢,这里有一个错误,但是它被DefaultXmlSerializer隐藏了。我现在想知道为什么会这样。同样,当发生这样的错误时,我不希望得到200 OK的响应,但我会提出一个问题:GitHub上的这个问题。干杯
public class HomeModule:NancyModule
{
    public class FooModel
    {
        public string Foo { get; set; }
    }

    public HomeApi()
    {
        Get("/", p =>
        {
            var r = new F { Foo = "Bar" };
            return r;
        });
    }
}
catch (Exception exception)
{
    if (this.traceConfiguration.DisplayErrorTraces)
     {
         var bytes = Encoding.UTF8.GetBytes(exception.Message);
         outputStream.Write(bytes, 0, exception.Message.Length);
     }
}