簡體   English   中英

使用 SQL CLR 調用 Web 服務

[英]Using SQL CLR to Call a Web Service

我跟着這個家伙演練,我在其他 Stack Overflow 帖子中看到過: https : //code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa

並且在運行我的存儲過程時出現錯誤,該過程調用具有應該調用 Web 服務的 Web 服務引用的類庫:

未找到設置屬性 xxxx

我認為,根據我從這條模糊消息中可以收集到的信息,在配置中找不到 Web 服務客戶端調用它的端點。

不幸的是,撰寫上述博客文章的人對此一無所知,並且在這條特定消息上搜索了數小時后,我一無所獲。

它有助於了解您使用的 SQL Server 版本。 但無論如何,如果您依賴ServiceModel庫(或您需要手動加載到 SQLServer 中的任何其他 .NET Framework 庫),那么這將不起作用。 您可以在 SQLCLR 中執行 Web 服務調用,但只能使用“ 支持的 .NET Framework 庫”列表中的

為了做這些事情,我通常建議使用普通的 'ol HttpWebRequest / HttpWebResponse類並手動處理 XML 的創建和解析(嗯,使用可用的 .NET 類)。 它不會自動為您提供強類型對象,但可以保證它適用於所有版本的 SQL Server。

此外,該帖子中關於啟用TRUSTWORTHY的建議是不好的建議。 您應該對程序集進行簽名,然后從 DLL 在master創建一個非對稱密鑰,然后從該非對稱密鑰創建一個登錄名,最后授予該登錄名的EXTERNAL ACCESS ASSEMBLY權限。 可以通過多種方式完成此操作,具體取決於您使用的 SQL Server 版本(SQL Server 2017 引入了新的復雜功能)以及您是否使用 Visual Studio / SSDT / SqlPackage`exe進行部署。 我寫了一系列關於這個主題的教程,展示了 2 個選項,它們都適用於所有版本的 SQL Server(嗯,2005 年到當前 - 目前是 2017 年),從以下開始:

SQLCLR 與 SQL Server 2017,第 1 部分:“CLR 嚴格安全性”——問題

第 1 部分(直接在上面鏈接)解釋了這種情況以及為什么 SQL Server 2017 中的新服務器范圍設置是一個問題,因為它缺乏通過 Microsoft 提供的工具(如 Visual Studio / SSDT)處理它的內置支持。 第 2 部分和第 3 部分是實際的解決方案。

我使用 SQL Server 項目 dll 引用的 dll 中的 Web 服務客戶端對象來完成這項工作。 我試圖在安全方面保持積極主動,並授予我的非對稱密鑰登錄外部使用權而不是不安全。 一旦我授予登錄不安全權限,它就能夠正確調用 Web 服務。

感謝@Solomon 提供有關安全的好提示。 我想我會在這里發布我的經驗給其他可能有問題的人。

您可以使用此演練 ( https://code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa ),但我將嘗試添加本文遺漏的有關如何使用在您的項目上簽名並在 SQL 中創建非對稱密鑰。

  1. 創建類型為 Library 的 Visual Studio 項目並添加對 WCF 服務的 Web 引用。 然后創建一個方法(確保它是靜態的),它創建您的 Web 服務客戶端對象並調用您的服務。

添加任何用於調用 Web 服務的靜態方法后,編譯此項目。

  1. 創建一個 SQL Server 數據庫項目類型的 Visual Studio 項目,並添加對先前庫項目的 dll 的引用。 使用上面的鏈接查看如何設置此項目。 (注意,當我在本地進行引用,然后將內容移到服務器時,我確保我的 SQL Server 數據庫項目具有用於庫項目的 dll 引用的這些屬性,復制本地 = 真,特定版本 = 假,生成 SQL 腳本 = 假, Is Visible = true, Model Aware = true, and permission set = external

  2. 我使用 windows SDK 中的 sn.exe 工具創建了我的 .snk 文件,這在 sql 中用於創建您的登錄名,也用於簽署前兩個 VS 項目。 (或者,如果您已經了解創建簽名程序集,請直接通過 Visual Studio 創建,然后在 SQL Server 中使用該 .snk)

  3. 我使用此鏈接https://www.codeproject.com/Articles/290249/Deploy-Use-assemblies-which-require-Unsafe-Externa (方法 2)來了解如何使用 sn.exe 工具以及如何設置用於 SQL Server 的非對稱密鑰和登錄名。 注意(sn.exe 工具的位置對我來說與本文中的不同,對我來說我必須去位置:c:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.1A\\bin\\ NETFX 4.5.1 工具這也可能因其他工具而異。

  4. 您必須做的最后一件事是重新配置您的數據庫服務器以允許 CLR,這是在 SQL Server 中使用以下命令完成的:

     EXEC sp_configure 'clr enabled', '1' RECONFIGURE
  5. 至於啟用 clr,我不確定這是否是您應該在存儲過程中打開,然后再次關閉(有人有安全想法嗎?)。

您可以遵循此存儲庫的相同示例.... 唯一的是它正在調用 Api。 但它基本上與您需要修改一些東西的概念相同。 希望對你有幫助。

看看這個存儲庫https://github.com/geral2/SQL-APIConsumer

第 1 步

CREATE DATABASE TestDB; GO

第 2 步

USE TestDB GO sp_configure 'clr enabled',1 RECONFIGURE GO

第 3 步

ALTER DATABASE TESTDB SET TRUSTWORTHY ON GO

第 4 步

CREATE ASSEMBLY [System.Runtime.Serialization] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll' WITH PERMISSION_SET = UNSAFE--external_access GO

第 5 步

CREATE ASSEMBLY [Newtonsoft.Json] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Newtonsoft.Json.dll' WITH PERMISSION_SET = UNSAFE go

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM