Task <>在Net Framework 4.0中不包含“ GetAwaiter”的定义

问题描述

我正在尝试使用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中的要求

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...