Разместить запрос на загрузку файла PDF C # - PullRequest
0 голосов
/ 07 июня 2019

Я отправляю почтовый запрос с приложенным файлом pdf example.pdf - этот файл добавляется в проект в Visual Studio как «контент». Проблема в том, что я получаю 400 Плохой запрос. Сервер API получает (IFormFile uploadedFile), но в моем случае uploadedFile имеет значение null. Авторизация хорошая, URL, заголовки тоже. Я проверил это через почтальона, и он работает правильно. Объект запроса в режиме отладки: '{byte [63933]}' Как решить это в C #?

string pathToPdfFile = "Scenarios\DefaultScenario\example.pdf";
byte[] requestBody = File.ReadAllBytes(pathToPdfFile);     

public static string PostRequestUploadFile(string url, Dictionary<string, string> headersDictionary, byte[] requestbody)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            if (headersDictionary != null)
            {
                foreach (KeyValuePair<string, string> entry in headersDictionary)
                {
                    request.Headers.Add(entry.Key, entry.Value);
                }
            }
            request.ContentType = "application/pdf";
            Stream dataStream = request.GetRequestStream();
            byte[] byteArray = requestbody;
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();
            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(stream))
                        {
                            return reader.ReadToEnd();
                        }
                    }
                }
            }
            catch (Exception Ex)
            {
                return Ex.ToString();
            }
        }

1 Ответ

0 голосов
/ 10 июня 2019

Я сделал некоторые изменения Я добавил заголовок Content Length

Возможно, вам придется изменить application/pdf на application/x-www-form-urlencoded Наконец, я не знаю, какие параметры вы отправляете в headersDictionary, но может отсутствовать имя поля 'file' формы

var request = (HttpWebRequest)WebRequest.Create(url);

request.Method = "POST"; // Consider using WebRequestMethods.Http.Post instead of "POST"
if (headersDictionary != null){
    foreach (KeyValuePair<string, string> entry in headersDictionary){
        request.Headers.Add(entry.Key, entry.Value);
    }
}

request.ContentType = "application/pdf";
// Dependending on your server, you may have to change
// to request.ContentType = "application/x-www-form-urlencoded";

byte[] byteArray = requestbody; // I don't know why you create a new variable here
request.ContentLength = byteArray.Length;

using (var dataStream = request.GetRequestStream()){
    dataStream.Write(byteArray, 0, byteArray.Length);
}

using(var response = (HttpWebResponse)request.GetResponse()){
    using(var reader  = new StreamReader(response.GetResponseStream())){
        return reader.ReadToEnd();
    }
}

В моих тестах с использованием это Я должен использовать request.ContentType = "application/x-www-form-urlencoded" вместо PDF (я не могу издеваться над всей вашей установкой)

Поскольку у меня нет сервера, который вы пытаетесь отправить, и у меня нет параметров, я не могу проверить это в вашей среде

Для дальнейшего использования HttpWebRequest является устаревшей (устаревшей) реализацией, которую следует избегать, и в новых реализациях следует использовать HttpClient читать дальше

...