public WorkItem CreateWorkItem(string title, string description, string comments)
    {
        HttpClient client = new HttpClient();
        //var response = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title="+title+"&description="+description+"&history="+comments, null).Result.Content;
        //var task = await client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title=" + title + "&description=" + description + "&history=" + comments, null);
        var response = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title=" +title+"&description="+description+"&history="+ comments, null).Result;
        var result = response.Content.ReadAsStringAsync().Result;
        var workItem = JsonConvert.DeserializeObject<WorkItem>(result);
        return workItem;
    }

masukkan deskripsi gambar di sini

Tujuannya adalah menggunakan ajax untuk menekan metode ini untuk mengaktifkan panggilan api dan mengisi WorkItem saya dengan data dan membaca respons itu setelah panggilan selesai.

 public class WorkItem
{
    public string title { get; set; }
    public string description { get; set; }
    public string status { get; set; }
    public string comments { get; set; }
}
2
Dominic Gozza 13 Desember 2017, 18:18
Aplikasi macam apa ini? Bukan ide yang baik untuk memblokir kode async dengan .Result.
 – 
Crowcoder
13 Desember 2017, 18:27
Ini adalah aplikasi MVC
 – 
Dominic Gozza
13 Desember 2017, 18:31
1
Anda akan kembali mengajukan pertanyaan lain ketika kode Anda menemui jalan buntu. Jadikan semua kode Anda asinkron atau gunakan HttpWebRequest alih-alih HttpClient.
 – 
Crowcoder
13 Desember 2017, 18:51
Tampaknya tidak masuk akal untuk melakukan panggilan asinkron, lalu tindak lanjuti dengan menunggu panggilan asinkron selesai. Apa yang sedang Anda coba lakukan?
 – 
theMayer
13 Desember 2017, 18:52
Saya akan segera memandu Anda melalui arus. Panggilan Ajax dari tampilan mengenai metode ini yang kemudian mengisi tautan dengan konten dari tampilan. Kemudian setelah saya menekan metode ini dalam model saya, saya menekan API saya sendiri untuk menjalankan panggilan ke Microsoft API. Jadi yang saya butuhkan adalah mengisi tautan ini dalam metode saya untuk menekan api saya untuk pergi ke microsoft. Saya perlu membaca tanggapannya juga
 – 
Dominic Gozza
13 Desember 2017, 19:07

2 jawaban

Anda melihat bahwa itu adalah "PostAsync" artinya ia mengembalikan Task<HttpWebResponse> sehingga Anda harus await atau memblokirnya sampai Anda mendapatkan hasil (.Result)

var response = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title="+title+"&description="+description+"&history="+comments, null).Result;

Atau

var response = await client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title="+title+"&description="+description+"&history="+comments, null);

Kemudian menggunakan NewstonSoft.Json

var workItem = JsonConvert.Deserialize<WorkItem>(contents);
1
Rawitas Krungkaew 13 Desember 2017, 18:32
Jadi itu Memperbaiki masalah saya tetapi mengapa? Itu juga tidak memperbaikinya sepenuhnya karena ketika saya mengembalikan konten saya mendapatkan "tidak dapat secara implisit mengonversi string tipe ke Models.WorkItem.
 – 
Dominic Gozza
13 Desember 2017, 18:24
Menambahkan beberapa komentar di atas
 – 
Rawitas Krungkaew
13 Desember 2017, 18:26
Oke, itu masuk akal! Belajar sesuatu yang baru setiap saat! Terima kasih. Jadi metode saya mengharuskan saya untuk mengembalikan WorkItem saya tetapi sepertinya respons dari panggilan tidak akan mengisi model saya dengan benar. Bagaimana saya bisa mengembalikan WorkItem dengan benar?
 – 
Dominic Gozza
13 Desember 2017, 18:29
1
Hanya deserialize itu
 – 
Rawitas Krungkaew
13 Desember 2017, 18:32
2
Ini tidak mengatasi masalah mendasar, yaitu MENGAPA async jika Anda melakukannya secara serial?
 – 
theMayer
13 Desember 2017, 18:53
client.PostAsync()

Adalah metode asinkron dan hanya akan mengembalikan tugas bukan hasilnya. Jika Anda ingin mendapatkan hasilnya kembali maka Anda perlu menunggu respon dari API. menggunakan

var response = await client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title="+title+"&description="+description+"&history="+comments, null)
var workItem = JsonConvert.Deserialize<WorkItem>(response.Content);

Ini adalah bagaimana kita dapat mengakses data. Tetapi untuk mencapai ini metode Anda harus ditandai sebagai 'async', maka hanya Anda yang dapat menggunakan kata kunci 'menunggu'. Metode lain adalah,

var response = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem").Result.Content
var workItem = JsonConvert.Deserialize<WorkItem>(response);

Tetapi ini bukan praktik yang baik untuk menggunakan hasil pada metode yang dapat ditunggu. Karena kami tidak dapat memanfaatkan asinkronisitas fitur tersebut.

Jika tidak,

var task = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem");
task.wait();
var workItem = JsonConvert.Deserialize<WorkItem>(task.Result.Content);

Ini juga bukan pendekatan yang baik. Ini semua opsi yang Anda miliki jika Anda tidak menggunakan fungsi 'async'.

public WorkItem CreateWorkItem(string title, string description, string comments)
{
    HttpClient client = new HttpClient();
    var task = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title="+title+"&description="+description+"&history="+comments, null);
task.Wait();
        var contents = task.Result.Content;
    }
0
SharmaPattar 13 Desember 2017, 19:47
Opsi apa lagi yang akan saya miliki jika saya tidak menggunakan fungsi async. Saya ingin menjelajahi opsi tersebut karena melakukan apa yang saya lakukan saat ini tidak berhasil dan bahkan dengan bantuan semua orang, saya tidak dapat memperbaikinya.
 – 
Dominic Gozza
13 Desember 2017, 19:18
Jika Anda tidak dapat menggunakan cara kata kunci 'async', ikuti pendekatan terakhir. Ini akan lebih baik dibandingkan dengan yang ke-2. Tunggu tugas hingga selesai dan gunakan properti 'Hasil' dari tugas yang dikembalikan untuk mengakses konten.
 – 
SharmaPattar
13 Desember 2017, 19:22
Nah menggunakan keyboard tunggu itulah yang memberi saya masalah. mengatakan httpresponsemessage tidak mengandung definisi menunggu
 – 
Dominic Gozza
13 Desember 2017, 19:33
Jika Anda menggunakan var response = menunggu client.PostAsync("localhost"); variabel respons harus bertipe HttpResponeMessage. Jika Anda menggunakan tanpa menunggu. var response = client.PostAsync("localhost"); Variabel respon bertipe Task. Anda dapat menggunakan metode 'wait()' hanya pada tipe Task Jika variabel Anda bertipe 'HttpResponseMessage', langsung gunakan properti Content
 – 
SharmaPattar
13 Desember 2017, 19:36
Hmm masih memberi saya masalah dengan .tunggu
 – 
Dominic Gozza
13 Desember 2017, 19:43