Загрузка больших файлов (WebException: соединение было неожиданно закрыто)

Примитивные типы данных преждевременной оптимизации.

Есть языки, которые обходятся только одним типом данных, скаляр, и они прекрасно справляются. Другим языкам не так повезло. Разработчики просто добавляют «int» и «double», потому что они должны что-то писать.

Важно не то, насколько велики типы данных, а то, для чего они используются. Если у вас есть переменная дня месяца, то не имеет большого значения, подписан он или нет, или тип char, short, int, long, long long, float, double или long double. Неважно, что это день месяца, а не месяц, или день недели, или что-то еще. См. Колонку Джоэла о том, как сделать неправильные вещи неправильными; Венгерская нотация в первоначальном предложении была хорошей идеей. На практике это в основном бесполезно, потому что говорит не то, что нужно.

6
задан Community 23 May 2017 в 11:46
поделиться

3 ответа

Update : nope, there is no redirect.

screenshot

Read RFC2388 few times, rewrote the code and it finally worked (i guess the trouble was in utf-read trailing boundary instead of correct 7 bit ascii). Hooray? Nope :(. Only small files are transfered, big ones throwing "The connection was closed unexpectedly".

System.Net.WebException was unhandled by user code
  Message="The underlying connection was closed: The connection was closed unexpectedly."
  Source="Uploader"
  StackTrace:
   at Uploader.Upload.ProcessUpload(String FilePath, String description, String password) in F:\MyDocuments\Visual Studio 2008\Projects\Uploader\Uploader.cs:line 96
   at Uploader.Form1.backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e) in F:\MyDocuments\Visual Studio 2008\Projects\Uploader\Form1.cs:line 45
   at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument) 

I know that's a bug with .net stack and few solutions exists :

1) increase both Timeout and ReadWriteTimeout of request

2) assign request.KeepAlive = false and System.Net.ServicePointManager.Expect100Continue = false

3) set ProtocolVersion to 1.0 Но ни один из них, ни все вместе не помогают в моем случае. Есть идеи?

ИЗМЕНИТЬ - Исходный код:

// .. request created, required params applied
httpWebRequest.ProtocolVersion = HttpVersion.Version10; // fix 1
httpWebRequest.KeepAlive = false; // fix 2
httpWebRequest.Timeout = 1000000000; // fix 3
httpWebRequest.ReadWriteTimeout = 1000000000; // fix 4
// .. request processed, data written to request stream
string strResponse = "";            
try
{
    using (WebResponse httpResponse = httpWebRequest.GetResponse()) // error here
        {
            using (Stream responseStream = httpResponse.GetResponseStream())
            {
                using (StreamReader streamReader = new StreamReader(responseStream))
                    {
                        strResponse = streamReader.ReadToEnd();
                    }
                }
            }
        }
catch (WebException exception)
{
    throw exception;
}
10
ответ дан 10 December 2019 в 00:42
поделиться

«В результате возвращается начальная страница загрузки, а не страница результатов со ссылками, которые я мог бы проанализировать и представить пользователю ...»

Возможно, это просто поведение функции загрузки: что после завершения загрузки вы можете загрузить другой файл? Я думаю, вам нужно вызвать другой URL-адрес для страницы «Обзор файла» (я полагаю, это тот, который вам нужен).


Изменить : На самом деле, если сервер отправляет «перенаправление» (http 3xx), это то, с чем должен справиться браузер, поэтому, если вы работаете со своим собственным клиентским приложением вместо браузера, вам придется реализовать перенаправление самостоятельно. Здесь RFC для получения дополнительной информации.

0
ответ дан 10 December 2019 в 00:42
поделиться

Есть некоторые тесты и номера, связанные с этой записи блога .

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

Хотя я на 100% согласен с комментарием darelf о том, что вы должны протестировать несколько браузеров, вы можете получить подробную информацию об использовании памяти и процессора в Chrome, нажав Shift + Esc.

-121--3723788-

Одна из причин, по которой неявные преобразования не выполняются, заключается в том, что присоединяемый столбец varchar содержит данные, не являющиеся числовыми. Oracle обрабатывает число для соединения varchar2, преобразуя последовательности (проверьте цитату Гэри в его комментарии), так что он фактически выполняет следующее:

select a.col1, b.somecol 
from tableA a inner join tableB b on to_number(b.col2)=a.col1;

Если tableB.col2 содержит значения, которые не являются числовыми - кажется вполне вероятным, это последовательность в конце концов - то он будет отбрасывать ORA-01722: недопустимый номер . Явное приведение числового столбца к последовательности приводит к короткому замыканию поведения Oracle по умолчанию.

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

Что касается производительности, можно построить индекс на основе функций...

create index whatever_idx on tableA ( to_char(col1) )
/ 
-121--3499322-

Попробуйте установить свойство maxRequestLength элемента, используемого во время выполнения, в файле Web.config.

0
ответ дан 10 December 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: