Страница ASP.Net для загрузки файла останавливается в середине оператора - PullRequest
3 голосов
/ 02 августа 2010

У нас есть очень простая страница ASP.Net для загрузки файла на наш веб-сервер.Страница не имеет элементов управления - клиент использует ее для автоматической отправки нам файла каждую ночь.

Иногда файл, как нам кажется, не доходит до нас, но клиент сообщает, что отправил его.

Мы добавили несколько операторов регистрации на страницу и обнаружили что-то довольно странное.Страница перестает выполняться прямо в середине оператора журнала.Никаких исключений, только вверх и умирает.

Вот код позади:

protected void Page_Load(object sender, EventArgs e) {
    try {
        // record that request came in at all
        log.Debug("Update Inventory page requested through HTTP {2} on {0} {1}", DateTime.Now.ToShortDateString(), DateTime.Now.ToLongTimeString(), IsPostBack ? "POST" : "GET");

        // make sure directory exists
        string basePath = Server.MapPath("~/admin/uploads/");
        log.Debug("Saving to folder {0}", basePath);

        if (!Directory.Exists(basePath)) {
            log.Debug("Creating folder {0}", basePath);
            Directory.CreateDirectory(basePath);
        }

    // generate a unique file name
        string fileName = DateTime.Now.Ticks.ToString() + ".dat";
        string path = basePath + fileName;
        log.Debug("Filename to save is {0}", fileName);

    // record initial bytes of stream/file
    StreamReader reader = new StreamReader(stream);
    string fileContents = reader.ReadToEnd();

    log.Debug("File received by GET is " + fileContents.Length + " characters long and begins with: " 
        + Environment.NewLine + fileContents.Substring(0, Math.Min(fileContents.Length, 1000)));

    // write out file
    File.WriteAllText(path, fileContents);

        log.Debug("Update Inventory page processing finished.");
        // trap for and record any and all exceptions
    } 
    catch (Exception ex) {
        log.Debug(ex);
    }
}

Кажется, что обработка прекращается в середине оператора log, который выводит длину и первую частьпеременная fileContents.Запись в журнал, которая происходит при сбое процесса, выглядит следующим образом:

2010-08-02 02:46:01.7342|DEBUG|UpdateInventory|Update Inventory page requested through HTTP GET on 8/2/2010 2:46:01 AM
2010-08-02 02:46:01.7655|DEBUG|UpdateInventory|Saving to folder c:\hosting\sites\musicgoround.com\wwwroot\admin\uploads\
2010-08-02 02:46:01.7811|DEBUG|UpdateInventory|Filename to save is 634163139617811250.dat
2010-08-02 02:48:02.3905|DEBUG|UpdateInventory|

Я действительно не понимаю, что с этим делать.

Я предполагаю, что при передаче произошла ошибкафайл, который либо исключение будет выброшен из строки reader.ReadToEnd ().И если бы не исключение, я бы ожидал, что обработка страницы продолжится, но я могу получить только часть файла (в этом случае он должен что-то записать).

Оператор ведения журнала обращается только к строковой переменной,и это внутри пробного улова.NLog - это используемый нами компонент ведения журнала, доступ к которому осуществляется через фасад, предоставленный проектом Simple Logging Facade в Codeplex.Таким образом, мы верим, что компонент ведения журнала является более или менее пуленепробиваемым - мы, конечно, не видим в его использовании ничего такого, что могло бы вызвать проблемы.

Итак, в чем же дело?С какой стати эта страница могла просто запуститься и перестать обрабатываться следующим образом?

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

1 Ответ

0 голосов
/ 02 августа 2010

Наиболее вероятным кандидатом является следующая строка:

2010-08-02 02:48:02.3905|DEBUG|UpdateInventory|

Это вызвано:

log.Debug(ex);

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

log.Error(ex);

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

...