2010-09-20 10 views
1

Je suis nouveau avec WCF, j'essaie de déployer mon exemple d'application WCF sur IIS, cette application fonctionne bien en mode débogage avec VS2008, cette application authentifie la WCF messages avec le code suivant. Je le fais comme ça, je l'ai ajouté le .DLLs résultat web.config et le Service.svc dans le répertoire wwwroot, et je l'ai également ajouté la chaîne de connexion dans IIS Manager, qui estDéploiement de l'application WCF dans IIS, mais la connexion à la base de données SQL Server ne fonctionne pas

Server=MyPC\SQLEXPRESS;Database=MySampleDb;Integrated Security=true 

J'utilise Sécurité intégrée de Windows. J'utilise même chaîne de connexion pour la connexion dans la classe de base de données, mais je me exception suivante,

S'il vous plaît me guider pour déployer cette application

Dans valideur

public override void Validate(string userName, string password) 
{ 
     ValidateUser(userName, password); 
} 

public static bool ValidateUser(string userName, string password) 
{ 
    if (!string.IsNullOrEmpty(userName)) 
    {   
     ICustomer customer = GetCustomerByUsername(userName); 
     if (customer ==null) 
     { 
      throw new exception("User Not found."); 
     } 
     else 
     { 
      return true; 
     } 
    } 
    else 
    { 
     throw new FaultException("User name is required!"); 
    } 
} 

public static ICustomer GetCustomerByUsername(string username) 
{ 
    try 
    { 
     //ConnectionString= "Server=MyPC\SQLEXPRESS;Database=MySampleDb;Integrated Security=true"; 
     OpenConnection(); 

     var cmd = new SqlCommand("GetUserByUsername", _connection) { CommandType = CommandType.StoredProcedure }; 

     cmd.Parameters.Add("Username", username); 

     connState = _connection.State.ToString(); 

     if (_connection.State == ConnectionState.Closed) 
     { 
      OpenConnection(); 
     }  

     SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

     ICustomer customer = null; 

     customer = ExtractCustomerFromDataReader(dr)[0]; 
     dr.Close(); 
     return customer; 
    } 
    catch (Exception e) 
    { 
     throw new Exception(e.Message + Environment.NewLine + e.StackTrace); 
    } 
    finally 
    { 
     CloseConnection(); 
    } 
} 

Exception:

ExecuteReader nécessite une connexion disponible et disponible. L'état actuel de la connexion est fermé. à System.Data.SqlClient.SqlConnection.GetOpenConnection (String méthode ) à System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute (String méthode , commande SqlCommand) à System.Data.SqlClient.SqlCommand.ValidateCommand (String procédé , async Boolean) à System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, runBehavior runBehavior, booléenne returnStream, méthode String, résultat de DbAsyncResult) à System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, méthode String) à System.Data.SqlClient.SqlCommand.ExecuteReader (comportement CommandBehavior , méthode String) à System.Data.SqlClient.SqlCommand.ExecuteReader (comportement CommandBehavior ) à Aschrafi.MobileZollServer.Services.DatabaseHelper.GetCustomerByUsername (String nom d'utilisateur) dans

Je pense qu'il me manque un certain point dans les paramètres de base de données ou dans le Gestionnaire des services Internet (IIS) les paramètres du site Web. Un tutoriel ou un lien vers un article pour le déploiement de WCF dans IIS et l'authentification de la communication WCF serait vraiment apprécié.

Merci d'avance.

Répondre

0

Le message d'erreur indique clairement que votre connexion n'est pas ouverte au moment où vous essayez d'exécuter votre lecteur de données.

En fait, je vous recommande de réécrire complètement votre méthode GetCustomerByUsername - utiliser les blocs using(...) { ... } comme les meilleures pratiques autour de votre SqlConnection et SqlCommand - quelque chose comme ceci:

public static ICustomer GetCustomerByUsername(string username) 
{ 
    ICustomer customer = null; 

    try 
    { 
     using(SqlConnection _con = new SqlConnection(connectionString)) 
     using(SqlCommand _cmd = new SqlCommand("GetUserByUsername", _con)) 
     { 
      _cmd.CommandType = CommandType.StoredProcedure; 
      _cmd.Parameters.Add("Username", username); 

      _con.Open(); 

      using(SqlDataReader dr = cmd.ExecuteReader()) 
      { 
       customer = ExtractCustomerFromDataReader(dr)[0]; 
       dr.Close(); 
      } 

      _con.Close(); 
     } 

     return customer; 
    } 
    catch (Exception e) 
    { 
     throw new Exception(e.Message + Environment.NewLine + e.StackTrace); 
    } 
} 

En utilisant les using() blocs, vous assurez la l'instance de classe en question sera libérée à la fin du bloc { ... } - plus besoin de garder trace de l'état et plus besoin d'une clause finally.

également: sécurité intégrée fonctionne très bien à partir de votre ordinateur de bureau - mais il ne fonctionne pas bien dans un environnement hébergé. Après tout: c'est le processus IIS qui est maintenant connecté à votre base de données - je préfère utiliser un utilisateur spécifique avec un mot de passe ici.

Mise à jour: vous pouvez nommer votre utilisateur comme vous voulez - par exemple utilisez le nom de l'application comme nom d'utilisateur ou tout ce qui a du sens pour vous. Vous devez créer cela en utilisant, par exemple, SQL Server Express Management Studio, et vous devez d'abord créer un login en utilisant CREATE LOGIN ou l'équivalent de l'interface graphique (sous "Sécurité" - "Connexions" - cliquez avec le bouton droit et choisissez "Nouveau Login") - cette étape donne le "nom" pour se connecter au serveur SQL en premier lieu. C'est le moment où vous choisissez un mot de passe. Une fois ce login créé, vous devez créer un utilisateur basé sur ce login dans votre base de données (USE <database name> GO - CREATE USER ...... - ou utiliser l'interface graphique - Votre base de données -> Sécurité -> Utilisateurs -> faites un clic droit et choisissez "Nouveau Utilisateur").

Une fois que vous avez tout cela, votre chaîne de connexion ressemblera à quelque chose comme:

Server=MyPC\SQLEXPRESS;Database=MySampleDb;User Id=(your user name);Pwd=(your password) 
+0

Merci pour votre réponse, quel utilisateur dois-je utiliser. Si je dois créer un nouveau ce qui devrait être Nom d'utilisateur: schéma par défaut: propriété Schemas. et rôles memebers et comment devrait regarder la chaîne de connexion dans le code C# et dans le gestionnaire IIS. – DronBoard

+0

@DronBoard: mis à jour ma réponse avec des informations supplémentaires –