2012-06-26 21 views
4

我有一個調用簡單的HTTP Web服務的CLR項目。它的x64目標,我只有在完成以下鏈接中提到的步驟後才能正確序列化,這些步驟講述了VS2010指向正確的目標體系結構(x64)所需的更改 - 只需卸載和更改即可。 csproj文件與一些額外的行來引用sgen.exe的正確版本:http://geekswithblogs.net/akraus1/archive/2011/12/10/148002.aspx序列化程序集不會上載到數據庫

現在,我可以通過將「生成序列化程序集」設置爲打開該項目及其.XmlSerializers.dll。我想這樣做是因爲我的CLR項目將在數據庫上部署,並且我不希望它在運行時序列化任何對象,因爲這些DLL未在我的數據庫中引用,我不想給予我的CLR項目權限出於安全原因而高於EXTERNAL_ACCESS,因爲這將用於安全性非常重要的生產環境中,也因爲我的數據庫不可信。

長話短說,我下面在以下鏈接先導,以我的系列化裝配上載到數據庫,但我得到一個錯誤:http://footheory.com/blogs/bennie/archive/2006/12/07/invoking-a-web-service-from-a-sqlclr-stored-procedure.aspx

的錯誤是:CREATE ASSEMBLY裝配」 .XmlSerializers'失敗,因爲該程序集是爲不受支持的Common Language Runtime版本而構建的。

有誰知道如何通過強制sgen.exe序列化CLR支持的程序集版本來解決此問題? Viva堆棧。

回答

2

我發現問題其實並不是我使用.NET 3.5作爲目標的事實,但我引用了sgen.exe工具的錯誤版本,在這種情況下,我需要x64版本的6.0A(轉換爲.NET 3.5):C:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ Bin \ x64 \ sgen.exe。現在我可以構建正確版本的序列化程序集,上傳並使用它。

2

SQL Server 2005/2008/2008R2僅支持.Net 2.0。您需要更改項目以達到此目的,請參見How to: Target a Specific .NET Framework Version or Profile。你做不是需要指定x64爲構建目標,SQLCLR程序集應該是通用目標構建的。

這就是說,從SQLCLR調用Web服務是一個真的真的很不好主意。不要這樣做。讓外部進程處理HTTP調用。

+1

我發現問題實際上並不是我使用.NET 3.5作爲目標的事實,但我引用了sgen.exe工具的錯誤版本,在這種情況下,我需要x64版本的6.0 A(轉換爲.NET 3.5):C:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ Bin \ x64 \ sgen.exe。現在我可以構建正確版本的序列化程序集,上傳並使用它。 – Alexandru

+0

此外,我不會說這是一個壞主意,讓CLR調用.NET Web服務。我限制我的CLR在具有EXTERNAL_ACCESS權限的用戶帳戶下運行。該DLL是強名稱簽名的,並且該用戶帳戶被映射到該DLL的非對稱密鑰。它非常安全。只有兩個DLL文件必須導入到數據庫中:CLR和CLR的序列化DLL,這有助於使用wsdl工具序列化生成的代理類,其中我只保留了構造函數和同步方法。它的可怕有多安全。 – Alexandru

+0

由於DLL包含一個Web引用,它加載的DLL文件已經被MSSQL Server支持,所以我不需要像創建代理到WCF服務那樣導入其他DLL文件。另外,使用x64作爲目標體系結構唯一不幸的缺點是我必須手動引用x64的程序集,以便通過卸載它並編輯.csproj文件來構建我的項目。 – Alexandru