У меня странная и странная прерывистая ошибка при загрузке файлов, и она появляется только на сервере развертывания? - PullRequest
1 голос
/ 04 ноября 2011

Я получаю эту ошибку случайно, иногда она показывает, а иногда нет!

Ошибка:

Теперь это исчезло: S! но он появится в ближайшие часы! Проще говоря, в нем говорится, что параметризованному запросу нужен параметр «@PorfilePic», который не был предоставлен, хотя он и предоставлен, и веб-сайт работает локально, а также работает на сервере. Я не изменяю код, провайдер не меняет никаких настроек.

Мне сказали, что я превышаю свой предел памяти для AppPool, который составляет 250 МБ, но я думаю, что он должен появиться, когда я превышаю и после отдыха пула он должен работать нормально. но это было так неделю назад. теперь он просто работает случайным образом в течение нескольких часов и случайным образом показывает эту ошибку! так что я надеюсь, что, возможно, кто-то получил ту же ошибку и может помочь разобраться в этом.

Кстати, это общая учетная запись хостинга Windows. и я говорил со своими провайдерами, честно говоря, я думаю, что они хороши во всем (Seriosuly), но во всем, кроме нахождения этой конкретной ошибки! : D

Код:

.Aspx Page:

<li>
    Profile Picture:
    <asp:FileUpload ID="ProfilePic_Upld" runat="server" ViewStateMode="Enabled" /><br />
</li>

Код за файлом:

if (ProfilePic_Upld.HasFile)
{
    string fileType = ProfilePic_Upld.PostedFile.ContentType;

    if (fileType == "image/bmp" || fileType == "image/gif" || fileType == "image/jpeg" || fileType == "image/png")
    {
        if (ProfilePic_Upld.PostedFile.ContentLength <= 10485760)
        {
            string ppFileName = ProfilePic_Upld.PostedFile.FileName;
            string savedFileName = newCruise.Name + "_pp" + ppFileName.Substring(ppFileName.IndexOf('.'));
            string cruisePpUploadPath = Server.MapPath(ConfigurationManager.AppSettings["cruisesPpUploadPath"].ToString());
            ProfilePic_Upld.SaveAs(cruisePpUploadPath + savedFileName);
            newCruise.ProfilePic = savedFileName;
        }
    }
}
else
{
    newCruise.ProfilePic = "default.jpeg";
}

Web.config (часть ApplicationSettings):

<appSettings>
<add key="cruisesPpUploadPath" value="~\resouces\cruises\cruise_pp\" />
<add key="cruisesDpUploadPath" value="~\resouces\cruises\cruise_dp\" />
<add key="cruisesClUploadPath" value="~\resouces\cruises\cruise_cl\" />
<add key="cruiseItinerariesPpUploadPath" value="~\resouces\cruises\itineraries\iti_pp\" />
<add key="cruiseItinerariesMapsUploadPath" value="~\resouces\cruises\itineraries\iti_maps\" />
<add key="cruiseReviewDocumentsUploadPath" value="~\resouces\cruises\reviews\" />

</appSettings>

Круиз-класс (newCruise)

public class Cruise
{
    public int ID
    { get; set; }

    public string Name
    { get; set; }

    public int CountryID
    { get; set; }

    public string ProfilePic
    { get; set; }

    public string Description
    { get; set; }

    public int OfficialRate
    { get; set; }

}

DAL Метод создания нового круиза

    public static int AddNewCruise(Cruise NewCruise)
    {
        string commandText = "INSERT INTO Cruises (Name, CountryID, ProfilePic, Description, OfficialRate) VALUES (@Name, @CountryID, @ProfilePic, @Description,  @OfficialRate); SELECT scope_identity();";
        int newCruiseId;

        Cruise newCruise = NewCruise;
        string name = newCruise.Name;
        int countryId = newCruise.CountryID;
        string profilePic = newCruise.ProfilePic;
        string desc = newCruise.Description;
        int officialRate = newCruise.OfficialRate;

        using (SqlConnection connection = new SqlConnection(ConnectionString))
        {
            using (SqlCommand command = new SqlCommand(commandText, connection))
            {
                command.Parameters.AddWithValue("@Name", name);
                command.Parameters.AddWithValue("@CountryID", countryId);
                command.Parameters.AddWithValue("@ProfilePic", profilePic);
                command.Parameters.AddWithValue("@Description", desc);
                command.Parameters.AddWithValue("@OfficialRate", officialRate);

                connection.Open();

                newCruiseId = Convert.ToInt32(command.ExecuteScalar());


                return newCruiseId;
            }
        }
    }

N.B У меня заканчивается срок, поэтому, если кто-то решит, что это проблема с сервером, надеюсь, вы могли бы порекомендовать несколько хороших провайдеров общего хостинга Windows.

N.B (2) Количество загружаемых изображений не превышает 1 МБ!

N.B (3) Ребята, пожалуйста, это очень важное замечание. В данный момент веб-сайт работает без каких-либо ошибок, и, тем не менее, вы правы в отношении обработки загруженного файла (который, между прочим, я обновил, добавив в него еще блоки для размера и типа файла при условии предоставления сообщения об ошибке и затем возврата;) Фактическая проблема заключается в том, что я использую тот же код, тот же веб-сайт, тот же сервер и настройки iis. то же самое приложение, и я также обновляю то же самое изображение, но я получаю ошибку случайно. это не может быть связано с обработкой файлов! Я загружаю изображение JPG размером 105 КБ. Однажды это работает, а другой нет! поэтому, однако, вы абсолютно правы в отношении обработки файла, и я уже последовал вашему совету, так как это дефект моей системы, но это не является причиной проблемы. Я бы очень хотел, чтобы все было так просто!

Вывод:

Прежде всего, проблема заключалась в том, что я тестирую при разработке на своем персональном ПК, где я использую Firefox, затем Я и клиент следим за работой с наших рабочих ПК, которые используют Internet Explorer. проблема заключалась в том, что не обрабатывались два условия для размера и типа, поэтому я не принимаю загруженный файл, но все равно вызываю метод базы данных, так что это был первый шаг. затем я просто следовал совету и возвращался всякий раз, когда какое-либо из условий не было выполнено, поэтому я загружаю одно и то же изображение в два разных экземпляра моего приложения (одно открывается из IE, а другое из FireFox). Firfox загружает нормально, но IE теперь отображает ошибку типа. Я провел небольшое исследование и выяснил, что IE получает jpg и png как прогрессивные типы (PJPEG и X-PNG), поэтому, добавив в мои условия типа image / jpeg и image / x-png, все работает отлично.

Спасибо за ваше время, высоко ценится =). Я надеюсь, что этот вопрос поможет, я не думаю, что это известная вещь в IE, но для меня я думаю, что это странно, и я верю, что другие люди изучают ту же проблему!

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

It states that the parametrized query need a parameter '@PorfilePic' which was not supplied1

Это для меня означает, что вы сохраняете имя / путь загруженного файла в базу данных, а значение, которое он пытается вставить (в это время), является пустой строкой.

Редактировать

Если посмотреть на код, если тип файла или условия размера файла не соблюдены, возможно, что newCruise.ProfilePic не будет установлен, что приведет к возможной нулевой ссылке.

(Трудно сказать без кода для класса newCruise.)

if (fileType == "image/bmp" || fileType == "image/gif" || fileType == "image/jpeg" || fileType == "image/png")
{
    if (ProfilePic_Upld.PostedFile.ContentLength <= 10485760)
    {

Редактировать

На основе вашего кода DAL. То, что я описал выше, определенно возможно.

Если тип файла не соответствует вашим условиям или размер файла слишком велик, код вызовет указанное исключение. (Если он вызывает метод AddNewCruise независимо от результата условий)

Я предлагаю выполнить некоторую проверку объекта Cruise перед его сохранением.

По крайней мере, вы не должны вызывать метод AddNewCruise, если вышеупомянутые условия типа и размера файла не были выполнены, без предоставления некоторых значений по умолчанию (например, newCruise.ProfilePic = "default.jpeg";).

0 голосов
/ 04 ноября 2011

jdavies прав насчет вашей проблемы, но, возможно, не ясно понимает.

Это не имеет ничего общего с утечками или ограничениями памяти сервера и не имеет ничего общего с производством / разработкой.

Это потому, что вы неправильно обрабатываете случай, когда кто-то загружает файл, который не изображение. В этом случае вы никогда не устанавливаете свойство изображения профиля на что-либо. Таким образом, он имеет значение null, в результате чего вы получаете именно ту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...