Как сохранить файл на диск из RestSharp через Swagger - PullRequest
0 голосов
/ 23 марта 2020

Этот вопрос немного похож на этот , и я использовал большинство принятых решений, включая предложенный ResponseTypeFilter.

В частности, мой контроллер Swagger выглядит следующим образом:

    [SwaggerFileResponse(HttpStatusCode.OK, "File Response")]
    [System.Web.Http.HttpGet]
    public void GetFileFromDownloadURL(string r_object_id = null)
    { //Task<Microsoft.Rest.HttpOperationResponse<System.IO.Stream>>?

        try
        {
            DocumentumDownloadFile file = new DocumentumDownloadFile();

            string[] r_object_ids = r_object_id.Split(',');
            foreach (string id in r_object_ids)
            {
                string topUrl = "..." + id.Trim() + "/download-url";
                ApiCall documentumCall = new ApiCall();
                IRestResponse response = documentumCall.ApiCaller(topUrl, false);

                JObject jsonres = JObject.Parse(response.Content);
                JArray array = (JArray)jsonres["entries"];

                string[] stringSeparators = new string[] {"D2"};
                string actual_download_url = "/D2" + array[0]["content"]["url"].ToString().Split(stringSeparators, StringSplitOptions.None)[1];
                ApiCall documentumCall2 = new ApiCall();
                IRestResponse downloadResponse = documentumCall2.ApiCaller(actual_download_url, true);


                File.WriteAllBytes("C:\temp\temp.pdf", downloadResponse.RawBytes);

            }

        }
        catch (Exception e)
        {

            throw new HttpResponseException(this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "An Error has occured, try again or  contact the administrator"));

        }

Однако мой код завершается ошибкой в ​​последнем File.WriteAllbyte, поскольку downloadResponse.RawBytes имеет значение null. Это озадачивает меня, потому что, если я запускаю тот же URL-адрес загрузки в Postman и «сохраняет как файл», файл сохраняется как ожидалось. Ответ также выглядит хорошо - рассматриваемый файл найден, он просто не передан в downloadUrl-response.

enter image description here

Итак, я думаю, что я делаю что-то неправильно в моем методе ApiCaller, который выглядит следующим образом:

public IRestResponse ApiCaller(string topUrl, bool download)
    {
        string url = "..." + topUrl;
        var client = new RestClient(url)
        {
            Authenticator = new HttpBasicAuthenticator("...", "..")
        };

        var request = new RestRequest(Method.GET);

        request.AddHeader("Accept", "application/json");

        if (download)
        {
            //var path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            //client.DownloadData(request).SaveAs("C:\temp\temp.pdf");
            //var response = client.DownloadData(request);

            var tempFile = Path.GetTempFileName();
            var stream = File.Create(tempFile, 1024, FileOptions.DeleteOnClose);
            request.ResponseWriter = responseStream => responseStream.CopyTo(stream);
            return client.Execute(request);


        }

        else
        {
            var response = client.Execute(request);
            return response;

        }

    }

Если я удаляю File.WriteAllbyte в моем контроллере, я не получаю ошибок, а только тело ответа, состоящее только из " [объект Blob] "и код ответа 204. Нет содержимого.

Я благодарен за любую пу sh в правильном направлении! Благодаря.

1 Ответ

0 голосов
/ 24 марта 2020

Я понял, что я сделал не так. response = client.Execute(request); должен быть запущен ДО request.ResponseWriter = responseStream => responseStream.CopyTo(stream);. Затем ответ содержит байтовые данные и может быть возвращен в контроллер для оператора File.WriteAllBytes.

Это было много часов работы для такого маленького маленького исправления ...

...