在IIS中部署WCF应用程序,但SQL Server数据库连接不起作用

时间:2010-09-20 19:17:34

标签: wcf authentication iis-7 database-connection

我是WCF的新手,我正在尝试在IIS上部署我的WCF示例应用程序,此应用程序在VS2008的调试模式下正常工作,此应用程序使用以下代码验证WCF消息。我是这样做的,我在wwwroot目录中添加了结果.dlls web.config和Service.svc,我还在IIS管理器中添加了连接字符串,这是

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

我使用的是Windows Integrated Security。我在数据库类中使用相同的连接字符串进行连接,但我得到以下异常,

请指导我部署此应用程序

在Validater中

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();  
    }  
}  

例外:

  

ExecuteReader需要打开和   可用连接。连接   目前的州已经关闭。在   System.Data.SqlClient.SqlConnection.GetOpenConnection(字符串   方法)at   System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(字符串   方法,SqlCommand命令)at   System.Data.SqlClient.SqlCommand.ValidateCommand(字符串   方法,布尔异步)at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,   Boolean returnStream,String方法,   DbAsyncResult结果)at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,   Boolean returnStream,String method)   在   System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior   行为,String方法)at   System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior   行为)   Aschrafi.MobileZollServer.Services.DatabaseHelper.GetCustomerByUsername(字符串   用户名)

我认为我在数据库设置或IIS管理器中缺少一些网站设置。我们非常感谢在IIS中进行WCF部署和验证WCF通信的一些教程或文章链接。

提前致谢。

1 个答案:

答案 0 :(得分:0)

错误消息非常清楚地表明,在您尝试执行数据读取器时,您的连接未打开。

基本上,我建议您完全重写GetCustomerByUsername方法 - 使用using(...) { ... }块作为SqlConnectionSqlCommand的最佳做法 - 这样的话:

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);  
    }  
}  

通过使用using()块,您可以确保在{ ... }块结束时释放有问题的类实例 - 不再需要跟踪状态而不再需要finally条款。

此外:集成安全性可以在桌面上正常运行 - 但在托管环境中无法正常运行。毕竟:这是现在连接到您的数据库的IIS进程 - 我宁愿在这里使用具有密码的特定用户。

更新:您可以为自己喜欢的用户命名 - 例如使用应用程序的名称作为您的用户名或任何对您有意义的名称。您需要使用例如SQL Server Express Management Studio,您需要首先使用CREATE LOGIN或等效的GUI创建登录(在“安全” - “登录”下 - 右键单击​​并选择“新登录”) - 此步骤为“命名“首先登录SQL Server的权利。这也是您选择密码的地方。

创建登录后,您需要根据数据库中的登录名创建用户(USE <database name> GO - CREATE USER ...... - 或使用GUI - 您的数据库 - &gt;安全性 - >用户 - &gt;权利 - 点击并选择“新用户”)。

完成所有这些后,您的连接字符串将类似于:

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