Загрузка файла из API-интерфейсов REST, в котором обнаружена проблема 302 на C #, но хорошо работает в Postman и браузере.

Я позвонил в Blackboard Learn API, чтобы загрузить файл. URL-адрес

https://blackboard.ddns.net/learn/api/public/v1/courses/uuid:d23e128e62f8483699c26836e06cab32/contents/_27_1/attachments/_13_1/download

Когда я нажимаю на ссылку в браузере, я вижу, что есть еще 2 302 Найдено до того, как контент будет отображаться в браузере.

https://blackboard.ddns.net/learn/api/public/v1/courses/uuid:d23e128e62f8483699c26836e06cab32/contents/_27_1/attachments/_13_1/download Код состояния: 302

https://blackboard.ddns.net/ bbcswebdav / xid-1407_1? VxJw3wfC56 = 1553768183 & Kq3cZcYS15 = 6716bb2d5bc740c29eb11e01d75bc913 & 3cCnGYSz89 = LhqjIQu9ReJ6IaoXzfmYZYPMer

https: // Доска. ddns.net/bbcswebdav/courses/1001/Blackboard%20code.txt?VxJw3wfC56=1553767343&Kq3cZcYS15=6716bb2d5bc740c29eb11e01d75bc913&3cCnGYSz89spd1d75bc913&3cCnGYSz89spdIsgwiSziSziSzvd3cnGYSz89spdIsgwdxpdxwdxpdxwdxwdxwd1

Я попытался использовать Postman, отправив токен-носитель и запросив GET-запрос для вызова метода, и он также получил содержимое.

Мне нужно написать код C #, чтобы получить содержимое файла, но я не получаю файл, но получаю 500 InternalServerError. Я пытался исправить проблему, но безуспешно. Есть ли у вас какие-нибудь мысли по этому поводу? Пожалуйста помоги.

Мой код в консольном приложении C # выглядит следующим образом:

static void Main(string[] args)
{
    //GET /learn/api/public/v1/courses/{courseId}/contents/{contentId}/attachments/{attachmentId}/download            
     string fileUrl = "/learn/api/public/v1/courses/uuid:d23e128e62f8483699c26836e06cab32/contents/_27_1/attachments/_13_1/download";

    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri("https://blackboard.ddns.net/");
        client.DefaultRequestHeaders.Authorization =
            new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "avnPkfmWSnf2Y5aKf1497LahLD3eKuwn");

        byte[] result = null;
        HttpResponseMessage response = client.GetAsync(fileUrl).Result;

        if (response.IsSuccessStatusCode)
        {
            result = response.Content.ReadAsByteArrayAsync().Result;
        }
    }
}

После прочтения сообщения Как можно Я получаю System.Net.Http.HttpClient, чтобы не следовать 302 перенаправлениям?, я попытался следовать 302 перенаправлениям и изменить код, как показано ниже, но в конце получил ту же ошибку 500 InternalServerError.

static void Main(string[] args)
        {
            //GET /learn/api/public/v1/courses/{courseId}/contents/{contentId}/attachments/{attachmentId}/download            

            string fileUrl = "/learn/api/public/v1/courses/uuid:d23e128e62f8483699c26836e06cab32/contents/_27_1/attachments/_13_1/download";

            HttpClientHandler clientHander = new HttpClientHandler();
            clientHander.AllowAutoRedirect = false;

            using (HttpClient client = new HttpClient(clientHander))
            {
                client.BaseAddress = new Uri("https://blackboard.ddns.net/");

                client.DefaultRequestHeaders.Authorization =
                    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "avnPkfmWSnf2Y5aKf1497LahLD3eKuwn");                

                byte[] result = null;

                HttpResponseMessage response = client.GetAsync(fileUrl).Result;

                if (response.StatusCode == System.Net.HttpStatusCode.Found)
                {
                    var locaton = response.Headers.Location.AbsoluteUri;
                    HttpResponseMessage secondResponse = client.GetAsync(locaton).Result;
                    if (secondResponse.StatusCode == System.Net.HttpStatusCode.Found)
                    {
                        string finalUrl = secondResponse.Headers.Location.OriginalString;
                        HttpResponseMessage thirdResponse = client.GetAsync(finalUrl).Result;
                        result = thirdResponse.Content.ReadAsByteArrayAsync().Result;
                        Console.Write(Encoding.UTF8.GetString(result));
                    }
                }               
            }
        }

person Simant    schedule 28.03.2019    source источник
comment
Лучший способ решить проблему - использовать сниффер, например wirehark или fiddler. Сравните рабочие данные сниффера с неработающими данными скрипачей. Посмотрите на рабочие заголовки запросов и сделайте нерабочие заголовки такими же. Существует слишком много причин, по которым невозможно начать угадывать правильный ответ. Единственный способ наверняка - использовать сниффер.   -  person jdweng    schedule 28.03.2019


Ответы (1)


Я пробовал использовать разные HTTP-клиенты, доступные в .NET (HttpWebRequest / Response, WebClient, HttpClient), но всегда получал 500 Internal Server Error. Итак, я решил протестировать сторонний HTTP-клиент, и, к счастью, RestSharp у меня сработал.

public ActionResult Index()
{
var client = new RestClient("https://blackboard.ddns.net/");

var request = new RestRequest("/learn/api/public/v1/courses/uuid:d23e128e62f8483699c26836e06cab32/contents/_27_1/attachments/_13_1/download", Method.GET);           

client.AddDefaultHeader("Authorization", "Bearer ZVAFzAuZ1ujYRENLrjNv3b8UWWvgRic4");

var response = client.Execute(request);           

return File(response.RawBytes, "text/plain", "MyTest.txt");

}
person Simant    schedule 01.04.2019