SQL CLR 存储过程调用 Web 服务接收 System.Net.WebException:请求失败,HTTP 状态 415:不支持的媒体类型

Posted

技术标签:

【中文标题】SQL CLR 存储过程调用 Web 服务接收 System.Net.WebException:请求失败,HTTP 状态 415:不支持的媒体类型【英文标题】:SQL CLR Stored Procedure calling Web Service receives System.Net.WebException: The request failed with HTTP status 415: Unsupported Media Type 【发布时间】:2014-04-30 13:10:38 【问题描述】:

我在 Visual Studio 2012(目标框架:3.5)中创建了一个 SQL CLR 项目,它将调用 Web 服务 (WCF)。最初,我在项目中创建了对 Web 服务的 Web 引用,但在执行创建的存储过程时,我不断收到“无法加载动态生成的程序集”。经过大量谷歌搜索后,我使用 wsdl 实用程序从 Web 服务的 WSDL 创建代码并将其添加到项目中。

我在项目的属性页面中打开了“生成序列化程序集”以生成序列化 DLL,因为 sgen 实用程序对我不起作用。在数据库(SQL Server 2008)方面,我启用了 CLR 并将数据库的可信任设置为 on。

然后,我在数据库中注册了 CLR 程序集和序列化 DLL,并创建了如下过程:

CREATE ASSEMBLY [Database] FROM 'C:\MyProject\bin\Debug\Database.dll' WITH PERMISSION_SET = UNSAFE;
CREATE ASSEMBLY [Database.XmlSerializers] FROM 'C:\MyProject\bin\Debug\Database.XmlSerializers.dll' WITH PERMISSION_SET = UNSAFE;  

CREATE PROCEDURE [dbo].[XSP_AlertReachedMilestone] @milestoneID INT 
 WITH EXECUTE AS CALLER
AS EXTERNAL NAME [Database].[StoredProcedures].[XSP_AlertReachedMilestone] 

但是当我执行存储过程时,我收到了“不支持的媒体类型”异常。我用谷歌搜索了建议检查客户端(数据库)和 Web 服务的 SOAP 版本的错误之一。我已验证 Web 服务使用 SOAP 1.2,但我不知道如何检查 SQL Server 使用的 SOAP 版本。

另一个建议检查客户端(数据库)的内容/mime 类型,但我不知道如何检查。

有什么想法可以解决这个错误吗?

【问题讨论】:

我已经解决了这个问题。我发现问题在于 Web 参考不适用于 WCF 和 CLR。发现这一点后,我使用 wsdl.exe 实用程序为 Web 服务生成了代理类,但它没有正确创建代码。使用 svcutil.exe 实用程序生成代理类对我有用。然后我将生成的代理类添加到我的项目中并编译程序集。 【参考方案1】:

我已经解决了这个问题。我发现问题在于 Web 引用不适用于 WCF 和 CLR。发现这一点后,我使用 wsdl.exe 实用程序为 Web 服务生成了代理类,但它没有正确创建代码。使用 svcutil.exe 实用程序生成代理类对我有用。然后我将生成的代理类添加到我的项目中并编译程序集。

【讨论】:

以上是关于SQL CLR 存储过程调用 Web 服务接收 System.Net.WebException:请求失败,HTTP 状态 415:不支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 的 clr 存储过程中执行动态 .net 代码

SQL触发器调用.NET的类方法续SQLCLR应用

用ASP调用SQL Server的视图和存储过程

SQL Server 的 CLR 存储过程是不是需要访问数据库?

mysql 存储过程总结(一)

sql查询里面xtype='u'是啥意思?