Как обрабатывать (только для локальной машины) большие fileupload с ASP.NET C# с веб-формами?
Привет,
У меня была консольная программа, которая делает анализ данных в файле ~2 ГБ, и мне было интересно, можно ли получить некоторую помощь, просто выполнив небольшую часть этого анализа. А именно, примерно в 1000 строках вниз по текстовому файлу находится список файлов компонентов, составляющих весь файл... Мне просто нужны их имена.
В качестве примера у меня есть следующий код, который отлично работает для захвата этих строк:
protected void filebtn_Click(object sender, EventArgs e) { try { if (fileupload.HasFile) { using (StreamReader reader = new StreamReader(fileupload.PostedFile.InputStream)) { String line; while ((line = reader.ReadLine()) != null) { bamnames.Add(line); } } } foreach (string name in bamnames) { compare1box.Items.Add(name); compare2box.Items.Add(name); } } catch (Exception ex) { alertbar.Visible = true; alertbar.Text = "<div class='grid-x'><div class='callout alert'><h5>Houston, we have a problem</h5><p>" + ex.Message + "</p></div>"; }
Где выход - это два списка, которые в конечном итоге позволят пользователю выбрать, какой из этих различных наборов в файле он хочет сравнить. Как только я это узнаю, начнется более жесткий анализ, но я, вероятно, смогу запустить его отдельно - во многом это делается для того, чтобы иметь реальный интерфейс для запуска и визуализации анализа.
Проблема в том, что когда я использую streamreader для анализа Строковой строки, чтобы действительно вытащить имена, это то, что я получаю через несколько мгновений:
System.Net.Sockets.SocketException Operation on non-blocking socket would block Description: HTTP 500.Error processing request. Details: Non-web exception. Exception origin (name of application or object): System. Exception stack trace: at System.Net.Sockets.Socket.Receive (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.Net.Sockets.SocketFlags socketFlags) [0x00010] in /private/tmp/source-mono-d15-3/bockbuild-d15-3/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/System/net/System/Net/Sockets/Socket.cs:1771 at System.Net.Sockets.NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x0009b] in /private/tmp/source-mono-d15-3/bockbuild-d15-3/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/System/net/System/Net/Sockets/NetworkStream.cs:513 Version Information: 5.2.0.215 (d15-3/da80840 Thu Jul 20 16:43:07 EDT 2017); ASP.NET Version: 4.0.30319.42000
У меня есть try/catch, однако он не улавливает, в чем бы ни заключалась проблема, и я просто нахожусь на странице ошибки 500.
Это в моно. IIS недоступен для меня, так как я сейчас не нахожусь в Windows.
Что я уже пробовал:
Я попытался расширить web. config как таковой:
<configuration> <system.web> <compilation debug="true" targetFramework="4.5"> <assemblies /> </compilation> <httpRuntime targetFramework="4.5" maxRequestLength="3145728" /> </system.web> </configuration>
Я попытался запустить фоновую задачу в очереди (но это, по-видимому, просто MVC-вещь).
И я попытался HttpPostedFile.InputStream эквивалентен, но каким-то образом мой строковый список имен стал 0-м в короткой тестовой версии и все еще давал ту же ошибку 500 в большом файле.
Я открыт для метода, который будет выполнять анализ только в фоновых, обычных старых файлах cs, но суть в том, чтобы сделать все это в одном решении visual studio, поэтому я не уверен, как это будет работать помимо планирования задач.
Все конструктивные предложения приветствуются.