我将WCF服务作为托管Windows服务托管,当使用者/客户端第二次,第三次或第四次调用其方法时,我不断收到AccessViolationException。崩溃是完全随机的,所以有时它可能会崩溃,直到稍后再调用几次。
以下是带有语法突出显示的代码,以便于阅读:http://pastebin.com/Z3Z06944
请参阅有关私有方法“CheckUser”的注释,因为这可能是发生异常的地方。
答案 0 :(得分:0)
我查看了您发布的代码,但我看不出这与WCF有什么关系。你说注释掉调用FireBirdSql(FbCommand?)的代码并且AV消失了。显然问题出在FireBirdSql上。尝试更新到最新版本,或将崩溃报告发送给开发人员。 AV(访问冲突)通常在p / invoke非托管代码互操作层中出现问题。这听起来像某种多线程问题会在WCF场景中出现。
(更新:编辑OP问题标题以包含FbSQL参考)
答案 1 :(得分:0)
在您的代码中,您没有明确关闭连接。
由于您正在使用using语句,因此它将被关闭,但可能会有延迟。
如果有最大连接数且请求快速到来,则在达到最大数量时可能会出现异常。
这可以解释错误的随机性。
修改强>
您的代码容易受到SQL Server注入攻击,您应该修复它。
您的问题可能是锁定错误,您是否有用户和密码的索引,如果不是,您正在进行表扫描,这会锁定表。
答案 2 :(得分:0)
我认为有更好的角色/成员资格提供程序系统,但根据您的代码,您可以使用using语句使用TRY / FINALLY结构来改进它。
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;
}
祝你有美好的一天!