RestSharp ExecuteAsync UI не ожидает завершения вызова покоя - PullRequest
0 голосов
/ 18 ноября 2018

Я пытался использовать загрузку файла из моего углового приложения 6, вызывая метод API GetFile (), написанный с использованием NancyFx.

Метод API GetFile () снова вызывает метод веб-API GetRemoteFile () с использованием RestSharp.

Метод 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;
        }

1 Ответ

0 голосов
/ 18 ноября 2018

Следуйте за асинхронным потоком и ждите 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;
}
...