1

我想这已经被问了一百万次了,但我无法弄清楚这些东西是如何工作的。我的应用程序在 c# 中针对框架 4.0。我尝试做一个简单的 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,罗纳德

Edit:: await 给了我一个编译错误:“await”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。

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

但这似乎也解决了它:

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;
4

1 回答 1

1

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

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

在这方面,await 的使用有点像病毒——它要求所有调用方法直到根节点都被标记为异步。至于为什么存在异步,请参阅有关主题的 SO question

您已经发现了使用此 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;
于 2013-09-05T13:57:39.927 回答