修改: 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.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);
}
为什么不会抛出/捕获此错误?
答案 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
然后转到Debug->Windows-Exception Settings (Ctrl+Alt+E)
。检查Common Language Runtime Exceptions