2011-05-17 58 views
2

我正在託管WCF服務作爲託管Windows服務,並且當消費者/客戶端第二次,第三次或第四次調用其方法時,我不斷收到AccessViolationException。崩潰是完全隨機的,所以有時它可能不會崩潰,直到稍後再進行多次調用。當在WCF服務中託管FireBirdSql時出現AccessViolationException

這裏的語法高亮以方便您閱讀代碼:http://pastebin.com/Z3Z06944

看到周圍的私有方法「CheckUser」的評論,因爲這是在異常可能會發生。

回答

0

我看了一下你發佈的代碼,並沒有看到這與WCF有什麼關係。你說註釋掉調用FireBirdSql(FbCommand?)和AV的代碼會消失。很明顯,問題出在FireBirdSql上。嘗試更新到最新版本,或將崩潰報告發送給開發人員。 AV(訪問衝突)通常發生在p/invoke非託管代碼interop層中的問題中。這聽起來像是一種多線程問題,將在WCF場景中引發。

(更新:編輯OP問題的標題包括FbSQL參考)

+0

AddUser()方法還包含一個我沒有註釋掉的FbCommand對象。當我註釋掉CheckUser()中的兩行並返回一個虛擬值時,不會再有崩潰。另外,我已經在使用最新版本的Firebird嵌入式SQL數據庫。 – rafale 2011-05-17 20:41:32

+0

@ dc200,所以當你在checkuser中註釋掉一些FBsql代碼時,它會停止崩潰。我仍然不明白你的觀點。這是FBSql。我會把錢放在上面。 – x0n 2011-05-17 20:57:51

+0

@ dec200你接受了我的答案 - 謹慎地更新問題,以便其他FB用戶可以從相同的修復中受益? – x0n 2011-05-19 17:18:26

0

在你的代碼中沒有明確關閉連接。

由於您使用using語句,它會關閉,但可能會有延遲。

如果有最大數量的連接並且請求快到了,如果達到最大數量,則可能會發生異常。

這將解釋錯誤的隨機性質。

編輯

你的代碼是容易受到SQL服務器注入攻擊,你應該解決這個問題。

你的問題可能是一個鎖定錯誤,你有一個用戶和密碼索引,如果不是你正在做一個表掃描,鎖定表。

+0

關閉連接是我嘗試的第一件事。問題依然存在。 – rafale 2011-05-17 20:37:09

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

祝您有美好的一天!