【发布时间】: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