Asp.net web api .NET WebApi请参阅原始请求

Asp.net web api .NET WebApi请参阅原始请求,asp.net-web-api,Asp.net Web Api,我有一个 public void Post([FromBody]Record value) -方法,我可以使用一些json从fiddler调用它 使用WizTools RESTClient 3.1和相同的json从我的mac调用该方法时,值总是null。它看起来好像没有被解析或者什么的 我在两台机器上都使用了Content-Type:application/json,并且我已经在VisualStudio调试器中仔细检查了Request.Content对象是否为头 如果我使用一个只有两个属性的简

我有一个

public void Post([FromBody]Record value)
-方法,我可以使用一些json从fiddler调用它

使用WizTools RESTClient 3.1和相同的json从我的mac调用该方法时,
值总是
null
。它看起来好像没有被解析或者什么的

我在两台机器上都使用了
Content-Type:application/json
,并且我已经在VisualStudio调试器中仔细检查了
Request.Content
对象是否为头

如果我使用一个只有两个属性的简单对象,如下所示:

public class Test123 {
  public string name { get; set; }
  public int age { get; set; }
}

public void Post([FromBody]Test123 value)
我可以从fiddler和mac上调用它,
从不为空


那么,关于如何调试它有什么提示吗?例如,是否有任何方法可以让我在PC上查看从mac发送到iis/visual studio的原始响应?它不会出现在fiddler中。

我认为您必须在http头请求中通知
内容类型。对于示例,如果要传递
json
格式,则必须在标题中添加:

内容类型:应用程序/json

在身体里:

{ name: "John", Age: 20 }
您将获得由asp.net mvc web api的模型绑定器创建的Test123对象


我喜欢使用软件手动发出请求,您还可以看到原始请求/响应,使用任何http动词创建请求,等等。

对于您的操作方法,如果您发送的请求内容类型为
内容类型:application/json
,请求消息正文为
{“name”:“john”,“age”:20}
,则应该正确绑定。顺便说一句,您不需要使用
[FromBody]
,因为
Test123
是一个复杂类型

无论如何,您可以通过添加这样的消息处理程序来查看原始请求消息

public class MyHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
                                             HttpRequestMessage request,
                                                CancellationToken token)
    {
        HttpMessageContent requestContent = new HttpMessageContent(request);
        string requestMessage = requestContent.ReadAsStringAsync().Result;

        return await base.SendAsync(request, token);
    }
}
公共类MyHandler:DelegatingHandler
{
受保护的覆盖异步任务SendAsync(
HttpRequestMessage请求,
取消令牌(令牌)
{
HttpMessageContent requestContent=新的HttpMessageContent(请求);
字符串requestMessage=requestContent.ReadAsStringAsync().Result;
返回wait base.sendaync(请求、令牌);
}
}
像下面这样添加处理程序
config.MessageHandlers.Add(newmyhandler())
WebApiConfig.cs
寄存器中
方法。原始请求将位于
requestMessage
变量中。您可以在调试或写入跟踪等过程中断开此处进行检查。

IIS(不是IIS Express或Kestrel)上有一个名为“失败的请求跟踪”的功能。此功能将向您显示通过筛选条件的任何请求/响应周期的详细日志

以下是输出日志的外观:

要启用此功能:

  • 开始->运行->键入“inetmgr”[这将打开IIS管理UI]
  • 在服务器级别启用FTW并添加规则
  • 添加规则(您可以添加HTTP 200代码作为筛选器来跟踪成功的请求,或者添加一些其他代码-如您所见)
  • 最后一步-我保证-每个网站都需要“选择加入”此功能
  • 就这样。。现在做你自己的事情,去文件夹与日志,按时间排序。您应该会看到在测试期间创建的新日志条目


    祝你好运

    在Mac上,您可以使用Charles Proxy调试http(相当于Fiddler),只需添加request.Content=newStringContent(requestMessage.Substring(requestMessage.IndexOf(“{”)),Encoding.UTF8,“application/json”);这样就不会干扰正在进行的链。