我在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支持。
请提出任何建议。
答案 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>