因此,我使用在 localhost 上运行的以下 C# 代码向部署在 IIS 10 上的 .net Core 7 Web api 发送 POST 请求。
我可以使用 C# 代码成功发出 GET 请求,但是 POST 请求返回 200 且响应正文为空。我使用 PostMan 测试了 POST 端点以及来自应用程序的 AJAX 请求,并且成功了。 AJAX 调用和 PostMan 请求实际上都会触发 API 方法执行的更改,但 C# 代码不会触发任何更改。
还请注意,当我在本地运行 API 并将本地应用程序指向本地 API 时,POST 会起作用。我已经用头撞墙两周了,试图解决这个问题,所以非常感谢您的帮助!
var request = new HttpRequestMessage(HttpMethod.Post, "{URL}");
request.Headers.Add("Authorization", "Bearer {API_TOKEN}");
client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
var content = new StringContent("{\r\n \"State\": \"PA\",\r\n \"Zip\": \"19087\",\r\n \"Country\": \"United States\"\r\n}", null, "application/json");
request.Content = content;
var response = Task.Run(async () => await client.SendAsync(request)).Result;
response.EnsureSuccessStatusCode();
var ret = Task.Run(async () => await response.Content.ReadAsStringAsync()).Result;
当我在本地运行 API 并将本地应用程序指向本地 API 时, 邮政工作有效。我已经用头撞墙两周了 试图解决这个问题,所以非常感谢您的帮助!
根据您的描述和共享代码,我尝试调查您的代码片段并发现了一些不一致之处。
首先,如果您也能分享您的控制器代码就更好了。但是,您请求的第一个问题
content
格式不正确。
我建议您检查您的请求模型并尝试相应地序列化它们。
我已尝试以下方式并且其按预期工作。
这是我尝试的示例:
演示控制器:
[Route("api/[controller]")]
[ApiController]
public class WebAPIRequestController : ControllerBase
{
[HttpPost]
[Route("WebAPIReturningEmptyString")]
public async Task<IActionResult> WebAPIReturningEmptyString([FromBody] string testdata)
{
return Ok("Request has been received!");
}
}
客户要求:
public async Task<string> CallAPI()
{
HttpClient client = new HttpClient();
var _requestUrl = "http://localhost:5094/api/WebAPIRequest/WebAPIReturningEmptyString";
var request = new HttpRequestMessage(HttpMethod.Post, _requestUrl);
//request.Headers.Add("Authorization", "Bearer {API_TOKEN}");
//client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
///var content = new StringContent("{\r\n \"State\": \"PA\",\r\n \"Zip\": \"19087\",\r\n \"Country\": \"United States\"\r\n}", null, "application/json");
var content = new StringContent("\"This is a test data\"", Encoding.UTF8, "application/json");
request.Content = content;
var response = Task.Run(async () => await client.SendAsync(request)).Result;
///var response = await client.SendAsync(request).Result
response.EnsureSuccessStatusCode();
// var ret = Task.Run(async () => await response.Content.ReadAsStringAsync()).Result;
var responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
注意: 如您所见,我对您的代码进行了评论,导致 API 请求无法访问。因为如前所述,reuqest 内容的格式不正确。
另一个问题是您使用了
Task.Run(async () => await response.Content.ReadAsStringAsync()).Result;
,它始终为空,并且您无法读取 API 响应。
相反,您可以执行以下操作,以便相应地读取 API 响应:
var responseBody = await response.Content.ReadAsStringAsync();
输出: