Почему возникает это заднее исключение «System.IO.IOException» в MySql .Data.MySqlClient.MySqlConnection.Open ()? - PullRequest
3 голосов
/ 10 июля 2020

Сведения о трассировке стека:

System.Web.HttpUnhandledException (0x80004005): 
Exception of type 'System.Web.HttpUnhandledException' was thrown. 
---> System.AggregateException: One or more errors occurred. 
---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at MySql.Data.MySqlClient.NativeDriver.StartSSL()
at MySql.Data.MySqlClient.NativeDriver.Open()
at MySql.Data.MySqlClient.Driver.Open()
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
at MySql.Data.MySqlClient.MySqlPool.GetConnection()
at MySql.Data.MySqlClient.MySqlConnection.Open()
at MySqlShell.ExecuteScalar(String query, MySqlConnection mySqlConnection, MySqlParameter[] mySqlParameters) in D:\myApp\MySqlShell.cs:line 47
at MyLibrary.GetAccountData() in D:\MyLibrary.cs:line 94
at MyClass.<>c_DisplayClass118_0.<FillDataGrid>b_1(Int32 i) in D:\myApp\MySqlShell.cs\EmployeeAccounts.aspx.cs:line 0
at System.Threading.Tasks.Parallel.<>c_DisplayClass17_0`1.<ForWorker>b_1()
at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
at System.Threading.Tasks.Task.<>c_DisplayClass176_0.<ExecuteSelfReplicating>b_0(Object )

Я получаю это исключение сзади, но наверняка примерно 1 или 2 раза на каждые 1000 запросов. Хотя я пытался избавиться от этого разными способами, но не смог найти никакого решения вместо дилемм.

Я прошел через этот вопрос похож на мое исключение, но решения пока нет. Я также нашел этот вопрос , но теперь просто встаю перед дилеммой, что было бы решением для моего исключения. И я попытался написать этот кусок строки в методе Global.asax.cs / Application_BeginRequest ():

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Примечание: цель моего приложения . NET framework версия 4.7 , и мне нужно исправить это исключение в коде моего приложения. Я не имею права работать на сервере. Итак, пожалуйста, помогите мне, правильно я поступаю или нет. Также убедитесь, что эта строка кода относится к моему исключению. Если это верно, следует ли использовать побитовый сокращенный оператор '| =' вместо '=' в приведенной выше строке кода?

Заранее спасибо.

1 Ответ

1 голос
/ 20 июля 2020

Изменить:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Кому:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)12288
                                     | (SecurityProtocolType)3072
                                     | (SecurityProtocolType)768;
                                     | SecurityProtocolType.Tls;

Очевидно, вам необходимо запустить этот код перед выполнением первого HTTP-запроса. Чтобы убедиться, что используется самая последняя версия TLS, вам нужно попробовать ее поймать. Примерно так:

try {
    ServicePointManager.SecurityProtocol = (SecurityProtocolType) 12288
            | (SecurityProtocolType) 3072
            | (SecurityProtocolType) 768
            | SecurityProtocolType.Tls;
} catch (NotSupportedException) {
    try {
        ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072
                | (SecurityProtocolType) 768
                | SecurityProtocolType.Tls;
    } catch (NotSupportedException) {
        try {
            ServicePointManager.SecurityProtocol = (SecurityProtocolType) 768
                    | SecurityProtocolType.Tls;
        } catch (NotSupportedException) {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
        }
    }
}
...