问题描述
我正在尝试使用C#代码访问Web API。我已经尝试在.Net Framework 4.0中使用以下代码,但其显示错误消息为“任务httpresponsemessage不包含getawaiter的定义”。请检查以下代码,并提出解决此问题的建议。
代码:-
static async Task RunAsync()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:9000/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// HTTP GET
HttpResponseMessage response = await client.GetAsync("api/products/1");
if (response.IsSuccessStatusCode)
{
Product product = await response.Content.ReadAsAsync<Product>();
Console.WriteLine("{0}\t${1}\t{2}",product.Name,product.Price,product.Category);
}
// HTTP POST
var gizmo = new Product() { Name = "Gizmo",Price = 100,Category = "Widget" };
response = await client.PostAsJsonAsync("api/products",gizmo);
if (response.IsSuccessStatusCode)
{
Uri gizmoUrl = response.Headers.Location;
// HTTP PUT
gizmo.Price = 80; // Update price
response = await client.PutAsJsonAsync(gizmoUrl,gizmo);
// HTTP DELETE
response = await client.DeleteAsync(gizmoUrl);
}
}
}
解决方法
好的,但是在.net Framework 4.0中可以做的替代解决方案是什么,如果可能的话,请提供示例代码
我们可以利用System.Net命名空间中可用的HttpWebRequest
类。
除了该Newtonsoft.Json库(以nuget包形式提供),还需要对数据进行序列化和反序列化。
内联是使用HttpWebRequest
static void Run()
{
// HTTP GET
var getRequest = WebRequest.Create("http://localhost:9000/api/products/1") as HttpWebRequest;
getRequest.ContentType = "application/json;charset=UTF-8";
getRequest.Method = "GET";
HttpWebResponse getResponse = getRequest.GetResponse() as HttpWebResponse;
if (getResponse.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = getResponse.GetResponseStream();
using (StreamReader sr = new StreamReader(responseStream))
{
var product = JsonConvert.DeserializeObject<Product>(sr.ReadToEnd());
Console.WriteLine("{0}\t${1}\t{2}",product.Name,product.Price,product.Category);
}
}
else
{
throw new Exception(getResponse.StatusDescription);
}
// HTTP POST
var gizmo = new Product() { Name = "Gizmo",Price = 100,Category = "Widget" };
var postRequest = WebRequest.Create("http://localhost:9000/api/products") as HttpWebRequest;
postRequest.ContentType = "application/json;charset=UTF-8";
postRequest.Method = "POST";
Stream stream = postRequest.GetRequestStream();
byte[] buffer = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(gizmo));
stream.Write(buffer,buffer.Length);
HttpWebResponse postResponse = postRequest.GetResponse() as HttpWebResponse;
if (postResponse.StatusCode == HttpStatusCode.OK)
{
//HTTP PUT
string gizmoUrl = postResponse.Headers["Location"];
var putRequest = WebRequest.Create(gizmoUrl) as HttpWebRequest;
putRequest.ContentType = "application/json;charset=UTF-8";
putRequest.Method = "PUT";
gizmo.Price = 80; //Update price
Stream putRequestStream = putRequest.GetRequestStream();
byte[] putRequestBuffer = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(gizmo));
stream.Write(buffer,buffer.Length);
HttpWebResponse putResponse = putRequest.GetResponse() as HttpWebResponse;
//HTTP DELETE
var deleteRequest = WebRequest.Create(gizmoUrl) as HttpWebRequest;
deleteRequest.ContentType = "application/json;charset=UTF-8";
deleteRequest.Method = "DELETE";
HttpWebResponse deleteResponse = deleteRequest.GetResponse() as HttpWebResponse;
}
else
{
throw new Exception(postResponse.StatusDescription);
}
}
注意:我从头开始还没有测试过代码。如果事情没有按预期进行,则可能需要进行少量修改。但是,这样做的目的是为了深入了解HttpWebRequest
类,该类可以完全满足您在.Net 4中的要求