dfarr1 Ответов: 0

Как обрабатывать (только для локальной машины) большие 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, поэтому я не уверен, как это будет работать помимо планирования задач.

Все конструктивные предложения приветствуются.

0 Ответов