我想这已被问了一百万次,但我无法弄清楚这些东西是如何起作用的。我的应用程序是针对框架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;
答案 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;