Соединение у клиентской базы зависает приложение

В моем приложении мне нужно подключиться к клиентской базе данных (SqlServer) только для того, чтобы посмотреть, сможем ли мы подключиться. Это мои строки подключения из web.config (значения не такие, я изменил ip, user и pwd)

<add name="ConnectionStringLibracom" connectionString="Data Source=192.168.1.45\SqlServer2008;Initial Catalog=xxx;user=xxx;pwd=xxx;Application Name=MES"
      providerName="System.Data.SqlClient" /> (MINE)
<add name="ConnectionStringMigplus" connectionString="Data Source=999.99.999.99;Initial Catalog=xxx;user=xxx;pwd=xxx"
          providerName="System.Data.SqlClient" /> (CLIENT)

но этот фрагмент кода зависает во всем приложении (когда я говорю, что оно зависает, я имею в виду, что оно не позволяет моему приложению подключаться к нашей БД). Я выполняю его в Default.aspx при событии Load:

protected void Page_Load(object sender, EventArgs e)
{
    if (!TestaIntegracaoErpMigplus())
    {
        lblMensagemIntegracao.Visible = true;
        Session["Integracao"] = false;
    }
    else
        Session["Integracao"] = true;
}

protected static bool TestaIntegracaoErpMigplus()
{
    string connectionStringMigplus = WebConfigurationManager.ConnectionStrings["ConnectionStringMigplus"].ConnectionString;
    bool ret = false;

    using (SqlConnection Conn = new SqlConnection(connectionStringMigplus))
    {
        try
        {
            Conn.Open();
            if (Conn.State == ConnectionState.Open)
            {
                ret = true;
            }
        }
        catch (SqlException)
        {
            ret = false;
        }
    }

    return ret;
}

@ EDIT: проблема не в том, могу ли я подключиться к серверу или нет, проблема в том, что когда я пытаюсь подключиться к этой базе данных, мой сайт asp.net зависает от новых запросов на странице других пользователей.

2 ответа

Решение

Вам не нужно проверять ConnectionState

Если соединение не может быть открыто, возникает исключение

Может быть, эта проверка вызывает вашу проблему

protected static bool TestaIntegracaoErpMigplus()
{
    bool ret = true;    

    try
    {
        string connectionStringMigplus = WebConfigurationManager.ConnectionStrings["ConnectionStringMigplus"].ConnectionString; 
        using (SqlConnection Conn = new SqlConnection(connectionStringMigplus))
        {
            Conn.Open();
        }
    }
    catch (Exception)
    {
        ret = false;
    }
    return ret;
}

-------------ОБНОВИТЬ------------------

Попробуйте уменьшить время ожидания подключения в строке подключения:

<add name="ConnectionStringMigplus" connectionString="Data Source=999.99.999.99;Initial Catalog=xxx;user=xxx;pwd=xxx;Connection Timeout=5" providerName="System.Data.SqlClient" />

Вы можете попробовать переместить соединение в Task и использовать функцию Wait с timeout, что-то вроде этого

protected static bool TestaIntegracaoErpMigplus()
{
    string connectionStringMigplus = WebConfigurationManager.ConnectionStrings["ConnectionStringMigplus"].ConnectionString;
    var task = Task.Factory.StartNew<bool>(()=>{
        bool ret = true;
        using (SqlConnection Conn = new SqlConnection(connectionStringMigplus))
        {
            try
            {
                Conn.Open();
            }
            catch (SqlException)
            {
                ret = false;
            }
        }

        return ret;
    });

    if(task.Wait(/*your timeout in milliseconds*/)){
        return task.Result;
    }

    return false;
}
Другие вопросы по тегам