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序列化。和.NetXmlSerliazer
无法序列化匿名类型:
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);
}
}