Я загружаю некоторые pdf
файлы с веб-сайтов с HttpClient
.Я должен войти, чтобы увидеть pdf
's url
' s.
Я загружаю все PDF правильно, без использования Parallel
.Но этот путь очень медленный.Я использую Parallel.Invoke
для ускорения этой операции, но иногда отсутствует authentication
.Поэтому мне нужно повторно войти на сайт и продолжить скачивать PDF-файлы и читать их.
List<Action> actionList = new List<Action>();
foreach (var item in company.PayrollTables)
{
actionList.Add(new Action(() => SavePayroll(item, myHtppClient, company.ClientId, company.SubClientNo)));// Download pdf's
}
var options = new ParallelOptions { MaxDegreeOfParallelism = 20 };
Parallel.Invoke(options, actionList.ToArray());
public void SavePayroll(PayrollTableModel model, BaseHttpClient webClient, int ClientId, string subClientNo)
{
try
{
var byteArray = webClient.GetByteArrayAsync(model.pdfDownloadUrl).Result;
var isPdf = IsPdf(byteArray, model, subClientNo, ClientId);
if (isPdf)
{
using (PdfReader reader = new PdfReader(byteArray))
{
for (int i = 1; i <= reader.NumberOfPages; i++)
{
string thePage = "";
thePage = PdfTextExtractor.GetTextFromPage(reader, i);
var table = GetEmployeeTable(thePage); // read existing page find table.
foreach (var row in table)
{
// read table nodes..
}
}
}
}
}
catch (Exception e)
{
//
}
}
myHtppClient
является общим для всех параллельных действий. Это должно быть,Поскольку веб-сайт не допускает многократный вход в систему.
В методе SavePayroll
я перемещаюсь между страницами веб-сайтов и нахожу правильные URL-адреса для загрузки pdf и чтения их с помощью ITextSharp
.
Я использую DownloadString
Метод изменения страниц для всех моих запросов и ловлю, если выход из системы или соединение все еще живы.Если веб-сайт отправил меня на страницу входа, чтобы я снова зарегистрировался.
public DownloadStringResult DownloadString(string url)
{
DownloadStringResult result = new DownloadStringResult();
try
{
var html = base.GetStringAsync(url).Result; // base is HttpClient.
if (html.Contains(WebSiteDto.LogoutMessage) || html.Contains("Please Login")) // Log-out website. So I need to re-login again.
{
result.IsRelogged = true;
result.HtmlResult = GetLoginResult(); // re-login
return result;
}
result.HtmlResult = html;
}
catch (Exception e) // This try catch for TimeOut Exception. I try many way but I still cant catch timeout exception. Or I cant tell wait just 5 second, if no answer then retry again.
{
return DownloadString(url);
}
return result;
}
Можно ли как-то рассказать обо всех параллельных действиях ", подождите, пока одно действие повторно войдет в систему еще раз.продолжай делать свой процесс. "?
Заранее спасибо.