【问题标题】:no overload for method 'PutAsync' takes 1 argument方法“PutAsync”没有重载需要 1 个参数
【发布时间】:2018-10-17 11:56:49
【问题描述】:

我对 Web API 比较陌生。我在 winForm 的客户端编写了如下代码:

using (var client = new HttpClient())
{
    List<string> param = new List<string>();
    param.Add(LblUnitsConsumed.Text);
    param.Add(LblUnitsRemaining.Text);
    param.Add(deviceIDtxt.Text);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage rsp = client.PutAsync(WebApiUrl + "/api/transaction/updateDevice/" + param).Result;
}    

在运行时将错误显示为“方法 'PutAsync' 没有重载需要 1 个参数”。它对 GetAsync、DeleteAsync 工作得非常好。但是对于 PutAsync 它会引发错误。有人可以帮我解决这个问题。

【问题讨论】:

  • PutAsyncPostAsync 用于发送数据。如果你不传递任何数据,你会向服务器发送什么?
  • 字符串加列表等于什么?可能不是你想的那样。
  • 不要访问异步方法的.Result。您需要await 结果,并将您当前的方法标记为async Taskasync Task&lt;T&gt;

标签: c# .net winforms httpclient


【解决方案1】:

PutAsync() 方法接受 Uri,HttpContent 作为参数。您不能同时传递 URL、数据作为一个参数。因此,请编辑您的代码以提供正确的类型。

using (var client = new HttpClient())
{
    List<string> param = new List<string>();
    param.Add(LblUnitsConsumed.Text);
    param.Add(LblUnitsRemaining.Text);
    param.Add(deviceIDtxt.Text);


    string jsonString = JsonConvert.SerializeObject(param);
    var requestUrl = new Uri(WebApiUrl + "/api/transaction/updateDevice/");
    using (HttpContent httpContent = new StringContent(jsonString))
    {
        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        HttpResponseMessage response = client.PutAsync(requestUrl, httpContent).Result;
    }   
}  

【讨论】:

  • Web Api控制器动作方法中的参数绑定用什么类型?
【解决方案2】:

为了添加已经评论的内容,PostAsync 和 PutAsync 期望一些 HttpContent 对象作为请求正文传递。如果 API 确实不需要/期望任何请求正文,您仍然需要创建此对象并将其传入。

你可以阅读更多关于这个方法调用的要求以及你可以使用什么作为HttpContenthere

【讨论】:

    【解决方案3】:

    您好,我对 REST API 的所有调用我使用这个库: https://github.com/jgiacomini/Tiny.RestClient

    API调用更简单。

    var client = new TinyRestClient(WebApiUrl);
    
    var response = await client.
                    Put("/api/transaction/updateDevice/").
                    AddFileContent(fileInfo, "text/plain").
                    ExecuteAsHttpResponseMessageAsync();
    

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多