【问题标题】:ASP.NET POST request to same host results in a null payload对同一主机的 ASP.NET POST 请求导致空负载
【发布时间】:2019-11-19 21:44:34
【问题描述】:

我想从托管 API 的同一应用程序中访问一些 ASP.NET API。真实世界的用例是我想将文件上传到 MVC 控制器,将其解析并通过对托管在同一应用程序上的 API 的 POST 请求进行一堆单独的 API 调用。我可以看到通过在 WebApi 控制器方法中设置断点来命中适当的 API 端点,但有效负载始终为空。我尝试使用 Flurl、RestSharp、WebClient 和 WebRequest 发出请求,但它们都不允许有效负载通过。如果我尝试通过单元/集成测试调用这些 POST 请求,它也会因空负载问题而失败。

ASP.NET 框架是否存在某种内置限制,阻止有效负载发布到同一应用程序?

var myObjectRow = new JObject();
myObjectRow["Key"] = 1;


/* RestSharp */
var request = new RestRequest("/api/MyObject", Method.POST);
request.AddHeader("Content-type", "application/json; charset=utf-8");
request.AddBody(request.JsonSerializer.Serialize(myObjectRow));
request.AddJsonBody(myObjectRow);
request.AddParameter("Application/Json", myObjectRow, ParameterType.RequestBody);
var response = RestClient.Execute<MyObject>(request);


/* WebClient */
using (var webClient = new WebClient())
{
    webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
    var payload = JsonConvert.SerializeObject(myObjectRow);
    var response = webClient.UploadString(BaseUrl + "/api/MyObject", "POST", payload);
}


/* WebRequest */
var payload = JsonConvert.SerializeObject(myObjectRow);
byte[] buf = Encoding.UTF8.GetBytes(payload);
var request = (HttpWebRequest)WebRequest.Create(BaseUrl + "/api/MyObject");
request.Method = "POST";
request.ContentLength = buf.Length;
request.ContentType = "application/json; charset=utf-8";
request.GetRequestStream().Write(buf, 0, buf.Length);

using (var response = (HttpWebResponse)request.GetResponse())
{
    var responseStream = response.GetResponseStream();
    var streamReader = new StreamReader(responseStream, Encoding.UTF8);
    var responseString = streamReader.ReadToEnd();
}

目标端点是这样的:

public class MyObjectController : ApiController
{
    public MyObject Post(MyObject myObject)
    {
        // myObject shows up null here
        return myObject;
    }
}

【问题讨论】:

  • 如果将 api 更改为接收字符串而不是 JSON 会发生什么?
  • 可能是两个问题之一。 (1) 表单主体不包含在 HTTP 请求中,或 (2) 表单主体有内容,但从表单主体到 MyObject 的绑定/映射失败,可能是由于解析问题。检查日志并让我们知道发生了哪些情况,因为答案会大不相同。

标签: c# asp.net asp.net-mvc asp.net-web-api


【解决方案1】:

试试这个:

 public class MyObjectController : ApiController
{
    public MyObject Post(MyObject myObject)
    {
         ModelState.Clear();
        // myObject shows up null here
        return myObject;
    }
}

【讨论】:

    【解决方案2】:

    我发现了问题所在。我正在使用的 Excel 阅读器将“.0”添加到整数字段,这导致反序列化在 POST 请求处理程序中静默失败。有效负载可以通过而没有这种不兼容性。

    【讨论】:

    • 解决方案是??您在此处的帖子没有提供问题的有效答案,您可以将其添加到 cmets 或编辑和更新您的问题。
    • 我不记得解决方案是什么。可能将一列数字格式化为文本。
    【解决方案3】:

    尝试将 myObjectRow 重命名为 myObject。我相信它期望参数具有相同的名称。

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 2019-12-15
      • 1970-01-01
      • 2013-06-25
      • 2013-09-23
      • 1970-01-01
      • 2017-09-12
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多