从存储过程调用Web服务

时间:2015-02-26 05:04:21

标签: sql-server xml web-services

我在IIS中托管了一个简单的Web服务。我在SQL Server的存储过程中调用它。 Web服务只有一种方法

 [WebMethod]
 public string HelloWorld()
 {
        return "Hello World";
 }

返回xml:

<string xmlns="http://tempuri.org/">Hello World</string>

执行存储过程时:

SET @Url = 'http://localhost:61004/Default Web Service/WebService1.asmx/
   HelloWorld';

EXEC sp_OACREATE 'MSXML2.ServerXMLHTTP', @obj OUT
EXEC sp_OAMethod @obj, 'open', NULL, 'GET', @Url, false
EXEC sp_OAMethod @obj, 'send'
EXEC sp_OAGetProperty @obj, 'responseText', @response OUT

SELECT @Xml = CAST(@response as xml)

Select @xml

EXEC sp_OADestroy @obj

我收到了这个错误:

  

不允许使用内部子集DTD解析XML。使用带有样式选项2的CONVERT来启用有限的内部子集DTD支持。

请提出任何建议。

2 个答案:

答案 0 :(得分:1)

您需要阅读错误消息并按照它告诉您的操作!您需要替换CAST

SELECT @Xml = CAST(@response as xml)

代之以:

SELECT @Xml = CONVERT(XML, @response, 2)

在使用CAST时,您的XML似乎会以某种方式引起悲伤 - 但是CONVERT和style = 2,可以正确处理其中许多情况

答案 1 :(得分:0)

我在web.config文件中添加了以下内容。

<configuration>
 <system.web>
 <webServices>
     <protocols>
         <add name="HttpGet"/>
         <add name="HttpPost"/>
     </protocols>
 </webServices>
 </system.web>
</configuration>

两个sql语句都有效。

SELECT @Xml = CAST(@response as xml)
SELECT @Xml = CONVERT(XML, @response, 2)

我改变了调用Web Service的路径。

SET @Url = 'http://localhost:61004/WebService1.asmx/HelloWorld';

然后它工作了!!!并返回xml字符串。

<string xmlns="http://tempuri.org/">Hello World</string>