C#Web API - POST请求未执行

时间:2017-07-04 10:14:14

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

我正在尝试从我的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请求的正确方法吗?提前谢谢

1 个答案:

答案 0 :(得分:1)

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

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

{"text":"someMessage"}

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

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

目前,您正尝试将mediatype字符串作为值发布到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请求。