Вставка в базу данных при загрузке файла - PullRequest
1 голос
/ 12 ноября 2009

У меня есть код на моей странице asp.net, куда я вставляю некоторые данные в базу данных при загрузке файла на сервер. Проблема, кажется, что приложение ожидает загрузки файла, прежде чем оно будет вставлено в базу данных. Ниже приведен код, похожий на мой.

public partial class _Default : System.Web.UI.Page
{
    protected HtmlInputFile XLSFileInput;

    ...

    protected void ImportButton_Click(object sender, EventArgs e)
    {
        InsertToDatabase(); //method to insert to database
        XLSFileInput.PostedFile.SaveAs(filePath + fileName);   
    }

    ...
}

Проблема здесь в том, что кажется, что метод InsertToDatabase () выполняется только после загрузки файла на сервер. Любая помощь приветствуется.

Ответы [ 5 ]

2 голосов
/ 12 ноября 2009

Это НИЧЕГО не связано с потоками IIS (веб-сервера), это скорее проблема HTTP.

Файл выбирается на клиенте, а затем все данные ответа (включая файл) публикуются на сервере до запуска любого серверного кода.

Таким образом, файл загружен, но не сохранен до InsertToDatabase (); выполняется.

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

Расскажите нам больше о том, чего вы пытаетесь достичь, и мы могли бы предложить несколько лучших предложений:).

2 голосов
/ 12 ноября 2009

Я бы не рекомендовал пытаться вручную управлять многопоточностью в ASP.NET, эту работу лучше оставить исключительно для IIS.

IMO для ASP.NET лучший способ справиться с этим - либо вызывать эти запросы с помощью нескольких операций AJAX из браузера, либо настраивать службу WCF, которая поддерживает односторонние операции, поэтому при вызове «InsertToDatabase» он выполняет пожар забудьте операцию со службой WCF, расположенной поверх вашей базы данных, которая выполняется немедленно, а затем переходит к следующей строке кода. Затем IIS выполняет код, который метод службы вызывает в своем собственном потоке.

IMO с использованием WCF является одним из наиболее подходящих способов обработки потоков в ASP.NET. Поскольку вы можете легко установить любой метод обслуживания как синхронный или асинхронный.

Edit:

Введение в создание служб Windows Communication Foundation

Что нужно знать об односторонних вызовах, обратных вызовах и событиях

1 голос
/ 12 ноября 2009

Загрузка файла является частью поста в формате HTML. Поскольку выгрузка является частью процесса публикации формы, это всегда происходит до того, как любой вашего серверного кода будет выполнен. Вызов PostedFile.SaveAs() не вызывает загрузку, он просто сохраняет то, что уже было загружено как часть запроса.

Если вам абсолютно необходимо, чтобы вставка базы данных произошла до начала загрузки, вы можете сделать так, как предлагает @ Chris Marisic , и выполнить вставку как вызов AJAX до отправки формы.

1 голос
/ 12 ноября 2009

Так обычно работают однопоточные приложения.

Из вашего кода я предполагаю, что вы используете ASP.NET Web Forms.

Вам может понадобиться отключить операцию InsertToDatabase (), чтобы освободить программу для загрузки файла. Возможно, в зависимости от вашей версии рассмотрите UpdatePanels как быстрый и грязный способ достичь этого?

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

Но ваш пример кода указывает, что InsertToDatabase () должна быть запущена до сохранения файла.

Если вы не уверены в AJAX / JavaScript, вы можете использовать пул потоков для использования метода InsertToDatabase (). Однако все зависит от того, что делает этот метод. Пожалуйста, предоставьте больше кода / деталей. Я лично использую это для вставки базы данных, которая происходит в фоновом режиме (Фильтр действий журналирования в ASP.NET MVC, поэтому другие пользователи могут не согласиться с правомерностью этого использования. Однако это может спасти вас от изучения другого языка.

ThreadPool.QueueUserWorkItem(delegate
 {
   // Code here
 }
);
0 голосов
/ 12 ноября 2009

Вы можете запустить другой поток для вставки базы данных. Например:

ThreadStart job = new ThreadStart(InsertToDatabase);
Thread thread = new Thread(job);
thread.Start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...