Лучший способ диагностировать эти виды ошибок WCF (те, которые действительно не говорят Вам очень) состоит в том, чтобы позволить проследить. В Вашем web.config файле добавьте следующее:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information"
propagateActivity="true">
<listeners>
<add name="ServiceModelTraceListener"
type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
initializeData="wcf-traces.svclog"/>
</listeners>
</source>
</sources>
</system.diagnostics>
можно тогда открыть получающийся файл в утилите SvcTraceViewer.exe, которая прибывает в SDK Платформы.NET (или с Visual Studio). На моей машине это может быть найдено в %PROGRAMFILES %\Microsoft SDKs\Windows\v6.0A\Bin\SvcTraceViewer.exe.
Просто ищут сообщение об ошибке (полужирным красный), и это скажет Вам конкретно, какова Ваша проблема.
Мы решили аналогичную проблему следующим образом. Нас не интересовало, насколько быстро происходила загрузка в течение всего времени, а просто примерно то, сколько времени она должна была занять, исходя из недавней активности, но, как вы говорите, не настолько недавней, чтобы цифры могли резко возрасти повсюду.
Причина, по которой нас не интересовали все временные рамки, заключалась в том, что загрузка могла составлять 1M / s в течение получаса, а затем переключаться на 10M / s в течение следующих десяти минут. Эти первые полчаса значительно снизят среднюю скорость, несмотря на то, что вы теперь гудите в довольно быстром темпе.
Мы создали кольцевой буфер с каждой ячейкой, содержащей количество, загруженное за 1-секундный период. . Размер кольцевого буфера составлял 300, что позволяло хранить исторические данные за 5 минут, и каждая ячейка была инициализирована нулем.
Smooth s ( экспоненциальное скользящее среднее . Или аналогичный).
Я предпочитаю использовать среднюю скорость за последние 10 секунд и разделить на нее оставшуюся часть. Деление на текущую скорость до слишком нестабильного при делении на среднее всего прогресса не может справиться с постоянными изменениями скорости (например, начинается другая загрузка).
Почему бы не вычислить скорость загрузки как среднее значение за всю загрузку, то есть:
s = f' / elapsed time
Таким образом, со временем она будет сглаживаться.