我是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通信的一些教程或文章链接。
提前致谢。
答案 0 :(得分:0)
错误消息非常清楚地表明,在您尝试执行数据读取器时,您的连接未打开。
基本上,我建议您完全重写GetCustomerByUsername
方法 - 使用using(...) { ... }
块作为SqlConnection
和SqlCommand
的最佳做法 - 这样的话:
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)