【问题标题】:RestSharp ExecuteAsync UI not waiting for rest call completionRestSharp ExecuteAsync UI 不等待休息呼叫完成
【发布时间】:2019-04-20 18:17:00
【问题描述】:

我一直在尝试通过调用使用 NancyFx 编写的 API 方法 GetFile() 从我的 Angular 6 应用程序下载文件。

GetFile() API 方法再次使用 RestSharp 调用 Web API 方法 GetRemoteFile()。

GetFile() 方法遵循异步/等待模式。但是我看到文件在 GetRemoteFile() 的成功回调甚至被调用之前就被下载了。

因此下载的文件是 0 字节。

using RestSharp.Extensions.MonoHttp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Linq;
using Nancy.Json;
using RestSharp.Extensions;
using System.Net;
using Nancy;
using Nancy.Responses;
using RestSharp;

private async Task<Nancy.Response> GetFile(int orderId)
        {
            var request = new RestRequest($"api/GetRemoteFile", Method.POST);            
            string json = SomeBodyData();
            request.AddJsonBody(new RemoteParameter
            {
                OId = documentId,
                Json = json
            });            
            var taskCompletionSource = new TaskCompletionSource<IResponse>();
            client.BaseUrl = new Uri("http://someremoteapi.com/orders/");            
            var res = client.PostAsync(request, (response,handle) =>
            {   
                taskCompletionSource.SetResult(response);
            });

            var data = await taskCompletionSource.Task;
            var stream = new MemoryStream(data.RawBytes);
            stream.Position = 0;
            var file= new StreamResponse(() => stream, "text/csv");
            return file;
        }

【问题讨论】:

  • 您是否尝试过等待 PostAsync,例如var res = await client.PostAsync(...)
  • 是的,我也试过了,但也没用。

标签: asp.net-web-api .net-core async-await restsharp nancy


【解决方案1】:

遵循异步流程并等待ExecuteTaskAsync。这样,您应该能够获得所需的行为。

private async Task<Nancy.Response> GetFile(int orderId) {
    var request = new RestRequest($"api/GetRemoteFile", Method.POST);
    string json = SomeBodyData();
    request.AddJsonBody(new RemoteParameter {
        OId = documentId,
        Json = json
    });        
    client.BaseUrl = new Uri("http://someremoteapi.com/orders/");
    var response = await client.ExecuteTaskAsync(request);

    var stream = new MemoryStream(response.RawBytes);
    stream.Position = 0;
    var file= new StreamResponse(() => stream, "text/csv");
    return file;
}

【讨论】:

  • 我试过了,但是没有用。即使在远程 api 调用完成之前,该文件仍会被下载。仅供参考,来自 UI 的调用是 GET 调用,而远程 api 调用是 POST 调用。
  • 顺便说一句,我没有看到 ExecuteTaskAsync() 方法,而是看到并使用了 ExecuteAsync()
  • @thinkmmk 在那里,再检查一遍github.com/restsharp/RestSharp/blob/master/RestSharp/…
  • @thinkmmk 根据您的上一条评论,当您没有实施我的建议时,您怎么能说这不起作用。
  • 我正在使用.net core,我没有看到你提到的方法。程序集 RestSharp.NetCore,版本 = 105.2.3.0。所以我尝试了你建议的最接近的方法,但没有奏效。我在这里错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
相关资源
最近更新 更多