Почему код ведет себя по-разному в C# Interactive (Roslyn) и в режиме отладки \ выпуска?

Обновление На самом деле после копания в сети мониторинга я обнаружил разницу в способе выполнения запроса кодом, выполняемым Roslyn и обычным режимом отладки \ выпуска. В режиме отладки \ выпуска ошибка трассировки Fiddler:

[Fiddler] The connection to 'host.com' failed.  <br/>System.Security.SecurityException Failed to negotiate HTTPS connection with server.fiddler.network.https&gt; HTTPS handshake to host.com (for #76) failed. System.IO.IOException Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. &lt; An existing connection was forcibly closed by the remote host

Оригинальный вопрос: я получил кусок кода:

HttpTransportOverWebClient c = new HttpTransportOverWebClient();
c.GetURL("https://web.page/query")

Где GetUrl - это какая-то обёртка:

public bool GetURL(string URL)
        {
            try
            {
                web.Headers.Add("User-Agent", browserAgent);
                byte[] data = web.DownloadData(URL);
                string characterSet = web.Response.CharacterSet;
                string encoding = (characterSet == null || characterSet == "" || characterSet.ToUpper() == "NONE") ? "UTF-8" : web.Response.CharacterSet.ToUpper();
                html = Encoding.GetEncoding(encoding).GetString(data);
                return true;
            }
            catch (Exception ex)
            {
                lastException = web.LastException == null ? new WebException(ex.Message) : web.LastException;
            }
            return false;
        }

Поведение в C# Интерактивный режим:

GetURL возвращает true, а html содержит данные

Поведение в режиме отладки \ выпуска:

GetURL возвращает false и ex содержит ошибку ниже:

An exception occurred during a WebClient request.
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadData(Uri address)
   at HttpCrawler.HttpTransportOverWebClient.GetURL(String URL) in ..HttpTransportOverWebClient.cs:line xx

Внутреннее исключение:

 at System.Net.WebClient.DownloadBitsState.SetResponse(WebResponse response)
   at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream, CompletionDelegate completionDelegate, AsyncOperation asyncOp)
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)

Пожалуйста совет

1 ответ

Решение

Решение

Я предполагаю, что интерактивный C# предварительно настроен в некотором роде, чтобы он мог по умолчанию использовать ServicePointManager.SecurityProtocol для более старой версии. В качестве разрешения я добавляю код:

using System.Net;
....
ServicePointManager.SecurityProtocol = 
       SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Другие вопросы по тегам