如何调试对ASP.NET Web API的XML调用

本文关键字:Web NET API 调用 XML ASP 何调试 调试 | 更新日期: 2023-09-27 18:00:36

我正在构建一个简单的ASP.NETWebneneneba API来接收和发布简单的数据传输对象(DTO)。

public TestDTO Get()
{
  return new TestDTO();
}
public void Post([FromBody]TestDTO value)
{
  var test = value.ToEntity();
}

TestDTO包含一个方法ToEntity(),它将DTO转换为Entity对象。

我首先执行一个GET请求以获得一个示例DTO,然后将其POST回服务。当我在请求头中指定Content-Type: application/json时,一切都很好。

但是,当我指定Content-Type: application/xml时,我GET是一个示例TestDTO,但我所尝试的一切都不允许POST工作。我刚刚得到一个异常,它抱怨value在尝试调用ToEntity()时为null。

当我尝试调试该语句以查看它为什么不解析XML时,调用堆栈只包含对[External Code]的引用。

我的问题是,如何调试POST函数,以便找出它为什么不解析XML?

如何调试对ASP.NET Web API的XML调用

潜在问题:发生这种情况的一种情况是,如果DTO使用字段而不是属性。在这种情况下,您需要用[DataContract]装饰类,用[DataMember] 装饰字段

有关更多信息:http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#xml_media_type_formatter.

如何调试

如果您想调试到Web API代码中,您可以使用symbolsource.org中的源代码包https://www.symbolsource.org/Public/Wiki/Using

配置Visual Studio

要配置Visual Studio以供符号/服务器使用,请按照以下说明进行操作:

  1. 转到"工具"->"选项"->"调试器"->"常规"
  2. 取消选中"仅启用我的代码(仅限托管代码)"
  3. 取消选中"启用.NET Framework源代码步进"。是的,这是一种误导,但如果你不这样做,那么Visual Studio将忽略你的自定义服务器顺序(请参阅上的详细信息),只使用它自己的服务器
  4. 选中"启用源服务器支持"
  5. 取消选中"要求源文件与原始版本完全匹配"
  6. 转到"工具"->"选项"->"调试器"->"符号"
  7. 为本地符号/源缓存选择一个文件夹。如果符号不存在或由于某种原因是只读的,则在获取符号时可能会遇到静默失败
  8. 在"符号文件(.pdb)位置"下添加符号服务器。请注意正确的顺序,因为有些服务器可能包含相同二进制文件的符号:有源或无源。我们建议进行以下设置:
    • http://referencesource.microsoft.com/symbols
    • http://srv.symbolsource.org/pdb/Public或已验证的变体(见上文)
    • http://srv.symbolsource.org/pdb/MyGet或已验证的变体(见上文)
    • (具有源的其他符号服务器)
    • http://msdl.microsoft.com/download/symbols
    • (没有源的其他符号服务器)

您也可以构建&将您自己编译为Web API是开源的http://aspnetwebstack.codeplex.com/SourceControl/latest

在这种情况下有效的方法是在浏览器和服务器之间放置一个代理,并观察发生了什么。Hardcore使用Wireshark,但我发现这对于HTTP调试来说有点过头了。我知道3个选项:

  • CharlesProxy(所有平台)
  • 小提琴手(Windows)
  • TCPMon(所有平台,已废弃)

通常你会在你的开发机器上添加代理,但我也成功地将它放在了服务器上(例如,监听端口81重定向到80)。