在WCF服务中托管FireBirdSql时出现AccessViolationException

时间:2011-05-17 19:59:55

标签: c# wcf firebird access-violation integer-overflow

我将WCF服务作为托管Windows服务托管,当使用者/客户端第二次,第三次或第四次调用其方法时,我不断收到AccessViolationException。崩溃是完全随机的,所以有时它可能会崩溃,直到稍后再调用几次。

以下是带有语法突出显示的代码,以便于阅读:http://pastebin.com/Z3Z06944

请参阅有关私有方法“CheckUser”的注释,因为这可能是发生异常的地方。

3 个答案:

答案 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;
    }

祝你有美好的一天!