2013-09-05 3 views
1

Я предполагаю, что это было задано в миллион раз, но я не могу понять, как работает материал. Мое приложение находится в C# против фреймворка 4.0. Я пытаюсь сделать простой POST, но мой POST даже не срабатывает, а не с C#. Это действительно становится вызвано простой PowerShell эквивалент, который выглядит следующим образом:HTTPClient POST method C#

$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" 

Где $ апсо является массивом пользовательских PSObjects. Следовательно, метод 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, Ronald

Edit :: ждет дает мне ошибку компиляции: «ждать» оператор может быть использован только в качестве метода асинхронного. Подумайте о маркировке этого метода с помощью модификатора «async» и измените его тип возврата на «Задача».

Если кто-нибудь может объяснить, что это значит, отлично! На самом деле не знаю.

Но это также, кажется, решить:

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

Вы должны изменить, что 'поджидают client.PostAsync' – dcastro

+0

Ну, это также, кажется, решить: – Ronald

+0

Что, кажется, решить эту проблему? Вы забыли добавить что-то в свой комментарий – dcastro

ответ

1

Await ключевое слово может использоваться только в методе, который оформлен с асинхронной ключевое слово, например:

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

В связи с этим, использование ожидания - это немного вирусный - для этого требуется, чтобы все вызывающие методы до корня были помечены как async. Что касается того, почему async существует, см. Это SO question about the subject.

Вы обнаружили другой способ использования этого API. Эти методы Async нового стиля возвращают Задачу, если есть результат или просто Задача, если результата нет. В этом случае, вы можете также сделать это:

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;