c # Webclient.UploadData работает на локальном компьютере, но не на сервере - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь развернуть веб-сайт, но у меня возникла ошибка в одной из моих форм с загрузкой изображения.

Во-первых, я использую NetworkSolutions для хостинга, и в одной из форм есть вход для загрузки файлов для изображений. Когда я запускаю приложение локально и загружаю изображение на FTP, все работает правильно, однако при развертывании на сервер время ожидания подключения (так как оно зависает на несколько мгновений), тогда я получаю сообщение " Ссылка на объект не установлена ​​для экземпляра объекта. ". Следует отметить, что SSL не настроен на этом сервере, однако я использую незащищенный порт.

[HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Submit(RegistrationViewModel viewModel)
    {
        if (!ModelState.IsValid)
        {
            return RedirectToAction("Index", viewModel);
        }
        if (Request.Files.Count > 0)
        {

            string path = String.Empty;
            HttpPostedFileBase file = Request.Files[0];

            if (file != null && file.ContentLength > 0)
            {
                string fileName = Guid.NewGuid().ToString() + Path.GetExtension(file.FileName); // Path.GetFileName(file.FileName);

                try
                {
                    using (WebClient client = new WebClient())
                    {
                        client.Credentials = new NetworkCredential("***", "***");

                        byte[] buffer = new byte[file.ContentLength];
                        file.InputStream.Read(buffer, 0, buffer.Length);
                        file.InputStream.Close();


                        path = "ftp://***.***.com:21/pics/" + fileName;
                        client.UploadData(path, buffer);

                    }
                }
                catch (WebException ex)
                {
                    string status = ((FtpWebResponse)ex.Response).StatusDescription;

                }
            }

            Context.Registrations.Add(new Registration
            {
                FirstName = viewModel.FirstName,
                LastName = viewModel.LastName,
                Email = viewModel.Email,
                PhoneNumber = viewModel.PhoneNumber,
                Age = viewModel.Age,
                ImagePath = path,
                CreatedDate = DateTime.Now
            });

            await Context.SaveChangesAsync();

            ConfirmationViewModel confirmViewModel = new ConfirmationViewModel
            {
                FirstName = viewModel.FirstName,
                LastName = viewModel.LastName,
                Email = viewModel.Email,
                PhoneNumber = viewModel.PhoneNumber
            };

            return RedirectToAction("Confirm", "Register", confirmViewModel);
        }
}

Я ожидаю, что изображение должно быть сохранено в путь, как это происходит локально, однако на сервере я не могу передать это исключение тайм-аута / нуля. Исключением в трассировке стека является случай попадания метода UploadData в строку 89 контроллера регистров (я показываю функцию Submit в контроллере регистров). Поскольку эта проблема возникает на сервере, получение отзывов об ошибке было довольно ограниченным. Удаляя try / catch, я получаю внутреннюю ошибку сервера, при попытке try я получаю исключение ссылки Null.

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

file.InputStream.Read(buffer, 0, buffer.Length);
file.InputStream.Close();

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я успешно сохранил изображение на сервер с сервера! Проблема сводилась к тому, что запрос был сделан специально с домена веб-сервера на домен ftp.

В настройках NetworkSolution были скрыты привилегии для папок (безопасность / защита паролем для всех, кто ищет), после разрешения доступа на запись в нужный мне каталог, я переключил свой метод на использование HttpPostedFileBase для сохранения файла непосредственно на сервере, и успех! Хотел бы я найти этот вариант с самого начала и сэкономить часы головной боли.

0 голосов
/ 15 января 2019

Я отследил ссылку на объект, не установленную для экземпляра исключения объекта, полученного из оператора catch. Кажется, исключение не является WebException, или, по крайней мере, ответ, который я читал, не был FtpWebResponse. (очень сложно отлаживать, так как мне приходится каждый раз развертывать), однако я все еще не могу по какой-то неизвестной причине.

...