2

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

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

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

4

3 回答 3

0

我查看了您发布的代码,但我不明白这与 WCF 有什么关系。你说注释掉调用 FireBirdSql (FbCommand?) 的代码并且 AV 消失了。显然问题出在 FireBirdSql 上。尝试更新到最新版本,或将崩溃报告发送给开发人员。AV(访问冲突)通常在 p/invoke 非托管代码互操作层出现问题时发生。这听起来像是在 WCF 场景中会出现的某种多线程问题。

(更新:编辑 OP 问题标题以包括 FbSQL 参考)

于 2011-05-17T20:10:52.120 回答
0

在您的代码中,您没有明确关闭连接。

由于您使用的是 using 语句,它将被关闭,但可能会有延迟。

如果有最大连接数并且请求很快到来,如果达到最大连接数,您可能会收到异常。

这将解释错误的随机性质。

编辑

您的代码容易受到 sql server 注入攻击,您应该修复它。

您的问题可能是锁定错误,您是否有用户和密码索引,如果没有,您正在执行表扫描,这会锁定表。

于 2011-05-17T20:31:09.793 回答
0

我认为有更好的角色/成员资格提供程序系统,但根据您的代码,您可以使用 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;
    }

祝你有美好的一天!

于 2011-12-13T02:16:26.427 回答