2010-09-20 18 views
1

我是新的WCF,我想在IIS上部署我的WCF示例应用程序,此应用程序在VS2008的调试模式下正常工作,此应用程序验证WCF具有以下代码的消息。我这样做是这样,我已经添加了导致的.dll的web.config和Service.svc在wwwroot目录,我还增加了连接字符串中的IIS管理器,它是在IIS中部署WCF应用程序,但SQL Server数据库连接不起作用

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

我使用Windows集成安全性。我使用相同的连接字符串在数据库类连接,但我得到以下异常,

请指引我部署的应用

在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需要一个打开的和可用的Connection。连接的 当前状态已关闭。在在 System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(字符串 方法,SqlCommand的命令) System.Data.SqlClient.SqlConnection.GetOpenConnection(字符串 方法)在 System.Data.SqlClient.SqlCommand.ValidateCommand(字符串 方法,布尔异步)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,runBehavior runBehavior, 布尔returnStream,字符串方法, DbAsyncResult结果)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior, RunBehavior runBehavior, 布尔returnStream,String方法) 在 System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior 行为,字符串方法)在 System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior 行为)在 Aschrafi.MobileZollServer.Services.DatabaseHelper.GetCustomerByUsername(字符串 用户名)在

我想我错过了数据库设置或在IIS管理器的网站设置的一些观点。在IIS中进行WCF部署并验证WCF通信的某些教程或文章链接将非常感谢。

在此先感谢。

回答

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 - 数据库 - >安全 - >用户 - >右键单击并选择“新建用户”)。

一旦你拥有了这一切,你的连接字符串看起来像:

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

谢谢您的回答,我应该使用哪个用户。 如果我必须创建新的应该是 登录名: 默认架构: 拥有架构。和角色成员 以及如何查看C#代码和IIS管理器中的连接字符串。 – DronBoard 2010-09-20 20:17:59

+0

@DronBoard:用附加信息更新了我的答案 – 2010-09-20 21:04:24

相关问题