HTTPClient POST方法c#

时间:2013-09-05 09:11:30

标签: c# post powershell httpclient

我想这已被问了一百万次,但我无法弄清楚这些东西是如何起作用的。我的应用程序是针对框架4.0的c#。 我尝试做一个简单的POST,但我的POST甚至不会被触发,而不是来自C#。它确实由一个简单的PowerShell等效触发,如下所示:

$uri="http://localhost:50554/api/pinfo/?sendmessage=yes&message=yep&killprocess=yes&timeout=20"
Invoke-RestMethod -uri $uri -Method Post -Body @($apso | ConvertTo-Json) -ContentType "application/json; charset=utf-8"

其中$ apso是一个自定义PSObject数组。因此,POST方法有效并且可用。所以在C#中我做了:

// this needs to be POSTed
PInfo pi = new PInfo();
pi.computername="test";
pi.username="test";
pi.PID="1234";
List<PInfo> lpi=new List<PInfo>();
lpi.Add(pi);

//Invoke the POST
HttpClient client = new HttpClient();

client.BaseAddress = new Uri("http://localhost:50554/");
var a = client.PostAsync("api/pinfo/?sendmessage=yes&message=tralala&killprocess=no&timeout=20", new StringContent(lpi.ToString(), System.Text.Encoding.UTF8, "application/json"))
             .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode());

但那不会触发相同的POST?我在这里缺少什么想法?

BR, 罗纳德

编辑:: await给了我一个编译错误:'await'操作符只能在异步方法中使用。考虑使用'async'修饰符标记此方法并将其返回类型更改为'Task'。

如果有人能解释这意味着什么,太棒了!真的不知道。

但这似乎也解决了这个问题:

PInfo p = new PInfo();
p.username = "test";
p.computername = "test";
p.PID = "test";
List<PInfo> testlist = new List<PInfo>();
testlist.Add(p);

client.BaseAddress = new Uri ("http://localhost:50554");

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage result = client.PostAsJsonAsync(url, testlist).Result;

string resultContent = result.Content.ReadAsStringAsync().Result;

1 个答案:

答案 0 :(得分:1)

await关键字只能用于使用async关键字修饰的方法,例如:

private async void button_click(object sender, EventArgs e) {
    var foo = await SomeMethodAsync(...);
}

在这方面,使用await有点病毒 - 它需要将根目录下的所有调用方法标记为异步。至于为何存在异步,请参阅此SO question about the subject

您已经发现了使用此API的另一种方法。如果有结果,这些新样式的Async方法返回一个Task,如果没有结果,则返回一个Task。在这种情况下,您也可以这样做:

Task<HttpResponseMessage> task = client.PostAsync("api/pinfo/?sendmessage=yes&message=tralala&killprocess=no&timeout=20", new StringContent(lpi.ToString(), System.Text.Encoding.UTF8, "application/json"));

HttpResponseMessage response = task.Result;