我正在託管WCF服務作爲託管Windows服務,並且當消費者/客戶端第二次,第三次或第四次調用其方法時,我不斷收到AccessViolationException。崩潰是完全隨機的,所以有時它可能不會崩潰,直到稍後再進行多次調用。當在WCF服務中託管FireBirdSql時出現AccessViolationException
這裏的語法高亮以方便您閱讀代碼:http://pastebin.com/Z3Z06944
看到周圍的私有方法「CheckUser」的評論,因爲這是在異常可能會發生。
我正在託管WCF服務作爲託管Windows服務,並且當消費者/客戶端第二次,第三次或第四次調用其方法時,我不斷收到AccessViolationException。崩潰是完全隨機的,所以有時它可能不會崩潰,直到稍後再進行多次調用。當在WCF服務中託管FireBirdSql時出現AccessViolationException
這裏的語法高亮以方便您閱讀代碼:http://pastebin.com/Z3Z06944
看到周圍的私有方法「CheckUser」的評論,因爲這是在異常可能會發生。
我看了一下你發佈的代碼,並沒有看到這與WCF有什麼關係。你說註釋掉調用FireBirdSql(FbCommand?)和AV的代碼會消失。很明顯,問題出在FireBirdSql上。嘗試更新到最新版本,或將崩潰報告發送給開發人員。 AV(訪問衝突)通常發生在p/invoke非託管代碼interop層中的問題中。這聽起來像是一種多線程問題,將在WCF場景中引發。
(更新:編輯OP問題的標題包括FbSQL參考)
在你的代碼中沒有明確關閉連接。
由於您使用using語句,它會關閉,但可能會有延遲。
如果有最大數量的連接並且請求快到了,如果達到最大數量,則可能會發生異常。
這將解釋錯誤的隨機性質。
編輯
你的代碼是容易受到SQL服務器注入攻擊,你應該解決這個問題。
你的問題可能是一個鎖定錯誤,你有一個用戶和密碼索引,如果不是你正在做一個表掃描,鎖定表。
關閉連接是我嘗試的第一件事。問題依然存在。 – rafale 2011-05-17 20:37:09
我在考慮有更好的角色/成員資格提供者系統,但是根據你的代碼,你可以用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;
}
祝您有美好的一天!
AddUser()方法還包含一個我沒有註釋掉的FbCommand對象。當我註釋掉CheckUser()中的兩行並返回一個虛擬值時,不會再有崩潰。另外,我已經在使用最新版本的Firebird嵌入式SQL數據庫。 – rafale 2011-05-17 20:41:32
@ dc200,所以當你在checkuser中註釋掉一些FBsql代碼時,它會停止崩潰。我仍然不明白你的觀點。這是FBSql。我會把錢放在上面。 – x0n 2011-05-17 20:57:51
@ dec200你接受了我的答案 - 謹慎地更新問題,以便其他FB用戶可以從相同的修復中受益? – x0n 2011-05-19 17:18:26