Метод SignalR работает в azure и на 1 машине разработки, но на другом он приводит к «Асинхронная операция не может быть запущена в это время» - PullRequest
0 голосов
/ 09 января 2020

Следующий метод работает в наших 3 azure средах и на основной машине разработчика, но на новой машине разработки он выдает ошибку:

Асинхронная операция не может быть выполнена началось в это время. Асинхронные операции могут быть запущены только внутри асинхронного обработчика или модуля или во время определенных событий в жизненном цикле страницы. Если это исключение произошло во время выполнения страницы, убедитесь, что страница помечена как <% @ Page Async = "true"%>.

Я посмотрел в настройках IIS, чтобы увидеть, есть ли Разница, пробные настройки в Visual Studio, единственное различие заключается в том, что на машине, на которой он работает, используется. net framework 4.7 или 4.7.2, тогда как на новой машине работает 4.8.0. Я также пытался установить 4.7.2 на другую машину, но не уверен, что она ее использует, или в этом проблема. Также я бы предпочел (если проблема связана с версией фреймворка) сделать код стабильным для 4.8, но сейчас я все еще озадачен тем, что является причиной проблемы.

У меня есть попытался воссоздать метод как httpclient, так как я мог прочитать, что он был бы более безопасным, чем использование webclient, но мне не удалось это сделать.

WebClient cliWeb;
        private void downloadFile(string url, string username, string password, EncodingParser.EncodingFormat encodingFormat, string method, string _importstepguid, string delimiter = "", bool headerrow = true)
        {
            GlobalHost.ConnectionManager.GetHubContext<ViewDataHub>().Clients.Client(this.Context.ConnectionId).updateStatus("1a");

            cliWeb = new WebClient();

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 |
                                                   SecurityProtocolType.Tls;
            cliWeb.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0");
            cliWeb.DownloadProgressChanged += (sender, args) => client_DownloadProgressChanged(sender, args, this.Context.ConnectionId);
            cliWeb.OpenReadCompleted += (sender, evt) =>
            {
                var totalLength = 0;

                ContentFound cf = new ContentFound();
                double processed = 0;
                int pushToScreen = 100;
                int processCounter = 0;
                using (var stream = evt.Result)
                {
                    var buffer = new byte[16 * 1024];
                    using (MemoryStream ms = new MemoryStream())
                    {
                        int read;
                        while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            ms.Write(buffer, 0, read);
                            processed += read;
                            processCounter = processCounter + 1;
                            if (processCounter % pushToScreen == 0)
                                GlobalHost.ConnectionManager.GetHubContext<ViewDataHub>().Clients.Client(this.Context.ConnectionId).NotifyProgress(new ProgressedBytes(totalLength, processed));

                        }
                        if (totalLength > 0)
                            GlobalHost.ConnectionManager.GetHubContext<ViewDataHub>().Clients.Client(this.Context.ConnectionId).NotifyProgress(new ProgressedBytes(totalLength, totalLength));
                        else
                            GlobalHost.ConnectionManager.GetHubContext<ViewDataHub>().Clients.Client(this.Context.ConnectionId).NotifyProgress(new ProgressedBytes(100, 100));
                        cf.Result = ms.ToArray();
                    }
                }
                evt.Result.Close();
                parseContent(cf, encodingFormat, method, _importstepguid, delimiter, headerrow);
            };

            cliWeb.Proxy = null;

            if (!string.IsNullOrEmpty(username))
            {
                var encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
                cliWeb.Headers.Add("Authorization", "Basic " + encoded);
                cliWeb.UseDefaultCredentials = false;
                cliWeb.Credentials = new NetworkCredential(username, password);
            }

            try
            {
                cliWeb.OpenReadAsync(new Uri(url));
            }
            catch (Exception e)
            {
                var a = ""; <--This is where it crashes
            }
        }
...