05 octubre 2010

Error 26: Una de las tantas causas (Varias Soluciónes)

Recientemente en un proyecto web que estoy realizando me apareció el no deseado error 26. Muchas son las causas, pero a veces no son las que se mencionan en general. Sin más resultados por mi propio conocimiento me dí a la tarea de ingresar a los foros de MSDN, en los que sin duda nos encontraremos con buenos asesores y foristas.

DESCRIPCIÓN DEL PROBLEMA

Cuando las conexiones a un servidor son rechazadas se muestra el error 26 de la siguiente manera:
Error de servidor en la aplicación '/...'.
--------------------------------------------------------------------------------
Error relacionado con la red o específico de la instancia mientras se establecía una conexión con el servidor SQL Server. No se encontró el servidor o éste no estaba accesible. Compruebe que el nombre de la instancia es correcto y que SQL Server está configurado para admitir conexiones remotas. (provider: Interfaces de red SQL, error: 26 - Error al buscar el servidor o instancia especificado)

Mi caso en particular mediante un proyecto de Visual Studio (ó MVWD Microsoft Visual Web Developer) la cual describí de la siguiente manera.

DESARROLLO DE LA PROBLEMÁTICA (Foro en MSDN)

Tengo una aplicación web desarrollada en ASP.NET con VS2010. La he publicado en el IIS. Esta aplicación hace una conexión a una base de datos de SQL Server 2005. Mi aplicación web funciona con autenticación forms, así que tengo una página llamada Login.aspx. Esta página tiene 2 combos para seleccionar unos datos antes de indicar el usuario y contraseña en la misma página. Los combos se cargan correctamente mediante un connectioString que es el siguiente:


Esta misma cadena de conexión la establecí como una variable global en una clase de mi solución para usarla en objetos SqlConnection, copiándola para evitar errores de digitación, de la siguiente forma:

En una clase pública:
Public cnstr As String = "Data Source=192.168.x.x;Initial Catalog=BDSIR;Persist Security Info=True;User ID=xxxx;Password=xxxxxx"


En la página de inicio de sesión:
cnn = New SqlConnection(VariablesGlobales.cnstr)
cnn.Open()


El error, que a diferencia de otros similares, se presenta cuando le doy iniciar sesión, la página demora un rato y luego muestra el siguiente error:

Error de servidor en la aplicación '/...'.
--------------------------------------------------------------------------------
Error relacionado con la red o específico de la instancia mientras se establecía una conexión con el servidor SQL Server. No se encontró el servidor o éste no estaba accesible. Compruebe que el nombre de la instancia es correcto y que SQL Server está configurado para admitir conexiones remotas. (provider: Interfaces de red SQL, error: 26 - Error al buscar el servidor o instancia especificado)

Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.

La cuestión es que aveces logro que se conecte y se inicie la sesión cuando durante la solicitud de login le doy clic a otro enlace, luego cuando regreso a las páginas privadas aparezco logeado. En ese momento cuando ingreso a una de esas páginas me aparece un error de "no se ha establecido el tipo Culture", por el estilo, y solamente es recargar la página y funciona. Pero de este caso anterior solo se da una vez cada 20 intentos, por decir.

Este es el seguimiento de pila (Si es que a alguien le sirve verdaderamente esta información):
Seguimiento de la pila:

[SqlException (0x80131904): Error relacionado con la red o específico de la instancia mientras se establecía
una conexión con el servidor SQL Server. No se encontró el servidor o éste no estaba accesible. Compruebe que
el nombre de la instancia es correcto y que SQL Server está configurado para admitir conexiones remotas.
(provider: Interfaces de red SQL, error: 26 - Error al buscar el servidor o instancia especificado)]

System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4846887
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject) +4860189
System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) +90
System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) +376
System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) +221
System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) +189
System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) +4861315
System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) +31System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) +433
System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) +66
System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) +499
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +65
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117
System.Data.SqlClient.SqlConnection.Open() +122
System.Web.DataAccess.SqlConnectionHolder.Open(HttpContext context, Boolean revertImpersonate) +87
System.Web.DataAccess.SqlConnectionHelper.GetConnection(String connectionString, Boolean revertImpersonation) +221
System.Web.Security.SqlMembershipProvider.GetPasswordWithFormat(String username, Boolean updateLastLoginActivityDate, Int32& status, String& password, Int32& passwordFormat, String& passwordSalt, Int32& failedPasswordAttemptCount, Int32& failedPasswordAnswerAttemptCount, Boolean& isApproved, DateTime& lastLoginDate, DateTime& lastActivityDate) +815
System.Web.Security.SqlMembershipProvider.CheckPassword(String username, String password, Boolean updateLastLoginActivityDate, Boolean failIfNotApproved, String& salt, Int32& passwordFormat) +105
System.Web.Security.SqlMembershipProvider.CheckPassword(String username, String password, Boolean updateLastLoginActivityDate, Boolean failIfNotApproved) +42
System.Web.Security.SqlMembershipProvider.ValidateUser(String username, String password) +78
System.Web.UI.WebControls.Login.AuthenticateUsingMembershipProvider(AuthenticateEventArgs e) +60
System.Web.UI.WebControls.Login.OnAuthenticate(AuthenticateEventArgs e) +119
System.Web.UI.WebControls.Login.AttemptLogin() +115
System.Web.UI.WebControls.Login.OnBubbleEvent(Object source, EventArgs e) +101
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.Button.OnCommand(CommandEventArgs e) +118
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +166
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
--------------------------------------------------------------------------------
Información de versión: Versión de Microsoft .NET Framework:2.0.50727.3082; Versión ASP.NET:2.0.50727.3082

He intentado cambiando la primera linea de login.aspx, cambiando el valor de AutoEventWireup por True, sin lograr nada.

< %@ Page Language="VB" MasterPageFile="~/design/Maestra.master" AutoEventWireup="true" CodeFile="Login.aspx.vb" Inherits="Default2" % >

También sé que no es un error del servidor que no permita conexiones remotas pues entonces no cargaría los combos. Adicional cuando estoy en mi máquina de desarrollo realizando las pruebas, NO SE GENERA ESE ERROR. Llega correctamente a la parte de:
FormsAuthentication.RedirectFromLoginPage(Login1.UserName,True)

De antemano, gracias por su atención y espero que esto nos sea útil a todos.


SOLUCIONES VARIAS

En los foros de MSDN me encontré con Enmanuell Grullard, forista desde el 2009 y colaborador de gran cantidad de foros, quien me guió durante el proceso de buscarle solución al error 26 de SQL Server Express. Entre ellas mencionaré las que él me sugirió por si alguien cae en este error también.

1. Cambio de IP

Algo que veo en tu connectionString que usted pone el nombre del Servidor con la IP  recomiendo que le ponga el nombre como se llama esa instancia ya que puede varios casos
1- Si deciden Cambiarle la Ip al servidor puede que la aplicaron no te funciones  pero si la pone con el nombre de la instancia aunque cambie la Ip te vas a funcionar toma en cuenta eso amigo..

Error de servidor en la aplicación '/sir'.
--------------------------------------------------------------------------------
Error relacionado con la red o específico de la instancia mientras se establecía una conexión 
con el servidor SQL Server. No se encontró el servidor o éste no estaba accesible. 

Compruebe que el nombre de la instancia es correcto y que SQL Server está configurado para
admitir conexiones remotas. (provider: Interfaces de red SQL, error: 26 - Error al buscar el 
servidor o instancia especificado) 

Ese Error es porque no Encuentra la IP que pudiste el conectionString cambiala por su nombre 

2. Verificación de funcionamiento en

Lo que me encuentro estraño es que si esta utilizando  la misma conection para lo combos no te deria funcionar por que esta utilizanado una intancia que no existe  eso es lo que dice cuando tenga logiarte con la pagina de login  ponle un brekpoint y dugeala y ve paso por paso y confirma si esoy la misma intancia  para el combo como para el login  .

Nota
verificate unos de estoy punto y dime cuales de eso tu cumple ?


Has cambiado la IP del servidor SQL o el nombre de máquina?

Has comprobado que SQL Server admite conexiones remotas?
Que los firewall de los clientes no están bloqueando el acceso?

3. Solución alternativa en MSDN

Bueno Días  Todavía no has podido Resolver tu problema ?
observa este enlace sobre una solución del Error 26 espero por fin pueda resolver
http://social.msdn.microsoft.com/forums/en-US/sqlgetstarted/thread/9354bf59-15a2-49f4-bc1f-f45371e054fc/


4. Base de datos que crea VS
Buscando por ahiaver si sigue eso paso para solucionar tu problema

Detalles de la excepción: System.Data.SqlClient.SqlException: A-relacionados o una instancia específica de errores de red al establecer una conexión con SQL Server. El servidor no se encontró o no accesible. Compruebe que el nombre de instancia es correcta y que SQL Server está configurado para permitir conexiones remotas. (Provider: Interfaces de red SQL, error: 26 - Error al buscar el servidor / instancia especificado)

SQL Server (Express 2008) Estudio de Gestión
Microsoft Visual C # 2008 Express Edition
Microsoft Visual Web Developer 2008 Express Edition

Cuando se utiliza MVWD y crear un sitio web mvwd que se abre una base de datos utiliza el IDE
connectionString = "Data Source = MyServer \ SQLEXPRESS; Initial Catalog = MyDatabase; Integrated Security = True"
providerName = "System.Data.SqlClient"
en el archivo web.config si utiliza un control de cuadrícula aspx

Asumiendo que publicar un Sitio Web de Información de Servicios de Internet (por ejemplo, http:// localhost / MySite c: \ inetpub \ wwwroot \ MySite)
cambiar la entrada de la siguiente manera
connectionString = "Data Source =;. \ SQLEXPRESS Initial Catalog = MyDatabase; Integrated Security = True"
providerName = "System.Data.SqlClient"

SQL Server Management Studio en el Administrador de configuración probablemente va a correr 'NT AUTHORITY \ Servicio de red' LogOnAs
Usted también puede tener que realizar las siguientes adiciones
Utilice MyDatabase
ir
sp_grantlogin 'NT AUTHORITY \ Servicio de red'
ir

Cheque del Seguro&gt; inicios de sesión doble clic en 'NT AUTHORITY \ Servicio de red'
y ver las asignaciones de los usuarios para MyDatabase
Por último puede que tenga que ejecutar REFERENCIAS GRANT, SELECT, INSERT, DELETE, UPDATE ON "MyTable" A "público"
dependiendo de la naturaleza de su seguridad y el acceso a las tablas de la base de datos en la página web.

5. MI SOLUCIÓN PERSONAL

Saludos foristas,
Bueno pues hoy 4 de octubre de 2010 logré ingresar y evitar el error 26. Lo que realicé durante todo este proceso me encontré con infinidad de foros y de soluciones diferentes a problemas relacionados, incluso aprendí algo más acerca de las configuraciones de ASP.NET
Entre dichos foros o blogs, tengo que agradecer en parte al blog de jonas, con el que me acerqué mas a este asunto de que el Visul Studio tenga que crear un base de datos propia para administrar las configuraciones del sitio.

Primero que todo, utilicé el blog de Francisco Javier Carbajosa, donde habla sobre la Membresía de ASP.NET 2.0.


Allí cambié la configuracion de la etiqueta , quitando la conexión que crea por defecto el Visual Studio de LocalSqlServer, y luego creándola nuevamente con la configuración propia de mi proyecto.   
   
Dentro de la etiqueta < System.web >
< roleManager defaultProvider="AspNetWindowsTokenRoleProvider" / >
Y las conectionStrings de la siguiente manera:
< connectionStrings >
    < remove name="LocalSqlServer" >< /remove >
       < add name="LocalSqlServer" connectionString="Data Source=XX;Initial Catalog=BDSIR;Persist Security Info=True;User ID=xxxx;Password=xxxxxx"
    providerName="System.Data.SqlClient" / >
   
    < add name="bdsirConnectionString"
         connectionString="Data Source=XX;Initial Catalog=BDSIR;Persist Security Info=True;User ID=xxxx;Password=xxxxxx"
         providerName="System.Data.SqlClient"/ >
  < /connectionStrings >
 
Luego se me genero un error donde me decía que no encontraba un procedimiento propio de Visual Studio. (validate_Schema parecido el nombre).

Paralelamente ejecuté el ejecutable la aplicación aspnet_regsql.exe que describe mejor "jonas" en su blog, con la configuracion de mi base de datos y servidor

http://labloguera.net/blogs/jonas/default.aspx?p=2

Con esto logré evitar el error 26 y espero no se vuelva a generar por asuntos propios del VS. Al final tenía en mi web.config varias secciones comentadas, pero que no estoy seguro si realmente influyen:

< Configsections > dentro de < Configuration >
< modules > dentro de < system.webserver >


espero aclarar esas dudas. Y bueno por lo demás, estos son los cambios de los que estoy consiente de haber realizado y espero le sirva a muchos más.

Por cierto el asunto con la ASPNETDB.MDF.
Resulta que el dichoso archivo se crea automáticamente por el VS, no se porque en otro proyecto no ha pasado lo mismo, pero en el mio sí. Para poder publicar correctamente, había que ir al menú Ver > Explorador de servidores. Allí, dar clic a Conexiones de datos y luego en el archivo de base de datos ASPNETDB.MDF clic derecho y Eliminar. Ahora sí pude publicar.

Por todo esto no hubo necesidad de configurar nada en el servidor, ni tampoco dar acceso a una cuenta 'NT AUTHORITY \ Servicio de red'.

Muchas gracias y espero no encontrarme con una nueva excepción "Error 26" por ahora. Gracias Enmanuel.

No hay comentarios: