2017-07-04 27 views
1

我试图从我的ASP.NET Core Web API项目发送POST请求,但请求永远不会发送。该方法执行时没有错误,但请求永远不会从异步方法中发出。C#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); 
    }); 
} 

这是使从核心Web API项目POST请求的正确方法?谢谢你在前进

+0

你为什么使用'async void'?使用'异步任务'。 – Lloyd

回答

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请求将被发送。

+0

嘿谢谢你的详细解答。但是我得到错误'HttpClient不包含PostAsJsonAsync的定义'。我发现我错过了库'Microsoft.AspNet.WebApi.Client'。问题是,该引用没有被添加,并且失败并显示错误消息:'一个或多个包与.NETCoreApp版本= v1.1(win-x86)不兼容。“任何解决方案? – Dinuka

+0

@RickGrimesTheCoder我的坏 - 看起来像这个扩展没有移植到.net核心呢。但是你可以编写你自己的代码来做同样的事情并且调用'PostAsync'(在这里描述)(https://stackoverflow.com/questions/40027299/where-is-postasjsonasync-method-in-asp-net-core) –

+1

谢谢,工作:) – Dinuka