【问题标题】:RestSharp asynchronous PUTRestSharp 异步 PUT
【发布时间】:2016-08-04 17:54:47
【问题描述】:

有一个应用程序,即可以访问数据库的 API 和一个使用 RestSharp 调用 API 的应用程序。 我实现了 RestSharp 的所有异步方法来通用。所以 GET、POST、DELETE 都在工作。我唯一不能工作的是 PUT。

首先这是我的控制器 PUT:

[HttpPut("{id}")]
public void Put(int id, [FromBody]ApplicationUser value)
{
    string p = value.Email;
}

这是我的方法:

 public Task<bool> PutRequestContentAsync<T>(string resource, object id, T resourceObject) where T : new()
    {
        RestClient client = new RestClient("http://localhost:54008/api/");
        RestRequest request = new RestRequest($"{resource}/{{id}}", Method.PUT);
        request.AddUrlSegment("id", id);
        request.AddObject(resourceObject);
        var tcs = new TaskCompletionSource<bool>();

        var asyncHandler = client.ExecuteAsync<T>(request, r =>
        {
            tcs.SetResult(r.ResponseStatus == ResponseStatus.Completed);
        });

        return tcs.Task;
    }

这是我在视图中的调用(GET 的所有其他调用,...都正常工作):

bool putOk = await new RepositoryCall()
    .PutRequestContentAsync("Values", 2, 
        new ApplicationUser { 
            Email="test@xxxxxxx.de" 
        }
    );

通过调试,响应状态为Completed,但从未调用 PUT。

知道可能是什么问题吗?

【问题讨论】:

  • 您指的是 PUT,但您的存储库调用反映了 DELETE。可能你复制粘贴了错误的代码。
  • @serhiyb 是的,是我发布的错误方法。更新:D
  • 你在哪个网络服务器上测试过它? IIS/IIS Express?
  • 应用程序现在直接使用 Visual Studio 2015 运行,所以 IIS Express
  • 酷,谢谢你的回答。

标签: c# asp.net asp.net-core asp.net-web-api2 restsharp


【解决方案1】:

所以最后我自己得到了答案......(昨天坐了 6 个小时,没有结果,今天又坐了一个小时,它有效)

public Task<bool> PutRequestContentAsync<T>(string resource, object id, T resourceObject) where T : new()
{
    RestClient client = new RestClient("http://localhost:54008/api/");
    RestRequest request = new RestRequest($"{resource}/{{id}}", Method.PUT);
    request.AddUrlSegment("id", id);

    request.RequestFormat = DataFormat.Json;
    request.AddBody(resourceObject);

    var tcs = new TaskCompletionSource<bool>();

    var asyncHandler = client.ExecuteAsync<T>(request, (response) => {
        tcs.SetResult(response.ResponseStatus == ResponseStatus.Completed);
    });
    return tcs.Task;
}

诀窍是添加一个 RequestFormat 并将 AddObject 更改为 AddBody :)

【讨论】:

  • 我遇到了类似的问题,但是我的控制器返回了一个 IActionResult,所以我放了 Task。但不知道如何让方法在返回 View 之前等待任务完成。
  • @RickerSilva 我认为您的问题是如何使用异步/等待?如果是,我认为您需要开始另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多