我将 WCF 服务作为托管 Windows 服务托管,当消费者/客户端第二次、第三次或第四次调用其方法时,我不断收到 AccessViolationException。崩溃是完全随机的,所以有时它可能要等到以后再调用几次才会崩溃。
这是带有语法突出显示的代码,以便于阅读: http: //pastebin.com/Z3Z06944
请参阅有关私有方法“CheckUser”的注释,因为这可能是发生异常的地方。
我将 WCF 服务作为托管 Windows 服务托管,当消费者/客户端第二次、第三次或第四次调用其方法时,我不断收到 AccessViolationException。崩溃是完全随机的,所以有时它可能要等到以后再调用几次才会崩溃。
这是带有语法突出显示的代码,以便于阅读: http: //pastebin.com/Z3Z06944
请参阅有关私有方法“CheckUser”的注释,因为这可能是发生异常的地方。
我查看了您发布的代码,但我不明白这与 WCF 有什么关系。你说注释掉调用 FireBirdSql (FbCommand?) 的代码并且 AV 消失了。显然问题出在 FireBirdSql 上。尝试更新到最新版本,或将崩溃报告发送给开发人员。AV(访问冲突)通常在 p/invoke 非托管代码互操作层出现问题时发生。这听起来像是在 WCF 场景中会出现的某种多线程问题。
(更新:编辑 OP 问题标题以包括 FbSQL 参考)
在您的代码中,您没有明确关闭连接。
由于您使用的是 using 语句,它将被关闭,但可能会有延迟。
如果有最大连接数并且请求很快到来,如果达到最大连接数,您可能会收到异常。
这将解释错误的随机性质。
编辑
您的代码容易受到 sql server 注入攻击,您应该修复它。
您的问题可能是锁定错误,您是否有用户和密码索引,如果没有,您正在执行表扫描,这会锁定表。
我认为有更好的角色/成员资格提供程序系统,但根据您的代码,您可以使用 TRY/FINALLY 结构和 using 语句来改进它。
public Boolean AddUser(string user, string pass)
{
using (FbConnection con = new FbConnection(ConfigurationManager.ConnectionStrings["DBi"].ConnectionString.ToString()))
{
using (FbCommand fbComm = new FbCommand("INSERT INTO users (name, pass) VALUES ('" + user + "','" + pass + "')", con))
{
fbComm.Connection.Open();
if (CheckUser(user, pass, con) == 0)
{
fbComm.ExecuteNonQuery();
return true;
}
fbComm.Connection.Close();
}
}
return false;
}
祝你有美好的一天!