【问题标题】:C# Web API - POST Request doesn't get executedC# Web API - POST 请求未执行
【发布时间】:2017-07-04 10:14:14
【问题描述】:

我正在尝试从我的 ASP.NET Core Web API 项目发送一个 POST 请求,但该请求从未发送过。该方法执行时没有错误,但请求永远不会从异步方法发出。

我的实现:

public async void notify(String message)
{    
    String url = "MY_WEBSERVICE_URL";
    var client = new HttpClient();
    client.BaseAddress = new Uri(url);
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "relativeAddress");
    request.Content = new StringContent("application/x-www-form-urlencoded;charset=UTF-8",
    Encoding.UTF8, "application/json");

    Byte[] byteArray = Encoding.UTF8.GetBytes("{\"text\":\"" + message + "\"}");
    request.Content.Headers.ContentLength = byteArray.Length;

    await client.SendAsync(request).ContinueWith(responseTask =>
    {
       Console.WriteLine("Response: {0}", responseTask.Result);
    });
}

这是从 Core Web API 项目发出 POST 请求的正确方法吗?提前谢谢你

【问题讨论】:

  • 你为什么使用async void?使用async Task

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


【解决方案1】:

首先,HttpClient 类(甚至是PostAsJsonAsync 扩展)中有一个专用方法PostAsync,您可以使用它来发送POST 请求,而无需手动创建HttpRequstMessage

现在关于您的代码 - 我相信您想发布以下 JSON 字符串:

{"text":"someMessage"}

您应该将此字符串设置为您要发送的StringContent 的内容:

var json = "{\"text\":\"" + message + "\"}";
request.Content = new StringContent(json, Encoding.UTF8, "application/json");

目前您正尝试将媒体类型字符串作为值发布到您的 API 端点。当然它不能反序列化到你的模型中。

注意1: StringContent 将自动添加具有适当值的Content-Length 标头。您不应该手动执行此操作。

注意2:除非这是一个事件处理程序,否则您不应使用async void - 请改用async Task


使用PostAsJsonAsync 的相同任务将如下所示:

public async Task Notify(string message)
{
   var string url = "MY_WEBSERVICE_URL";
   var client = new HttpClient();
   client.BaseAddress = new Uri(url);
   var notification = new Notification { Text = message }; // use some model class
   var resonse = await client.PostAsJsonAsync("relativeAddress", notification);
   if (response.IsSuccessStatusCode)
   {
       var content = await response.Content.ReadAsStringAsync();
   }
}

在这种情况下,您的模型将自动序列化为 JSON,将创建适当的内容并发送 POST 请求。

【讨论】:

  • 您好,感谢您的详细回答。但我收到了错误HttpClient does not contain a definition for PostAsJsonAsync。我发现我错过了图书馆Microsoft.AspNet.WebApi.Client。问题是,该引用没有被添加并且失败并显示错误消息:One or more packages are incompatible with .NETCoreApp,Version=v1.1 (win-x86). Any solution?
  • @RickGrimesTheCoder 我的错 - 看起来这个扩展还没有移植到 .net 核心。但是您可以编写自己的代码来做同样的事情并将PostAsync 称为described here
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2020-07-06
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多