我有一个带有以下方法的网络服务(c#):
[WebMethod]
public string HelloWorld1(string a)
{
return "Hello World - " + a.ToString();
}
[WebMethod]
public string HelloWorld2()
{
return "Hello World";
}
我正在尝试使用以下代码在sql-server过程中使用它:
...
-- URL 1
set @url = 'http://localhost/ws/ws1.asmx/HelloWorld2'
-- URL 2
--set @url = 'http://localhost/ws/ws1.asmx/HelloWorld1?a=amama'
EXEC msdb.dbo.sp_OACreate 'MSXML2.XMLHTTP', @OBJ OUT
EXEC msdb.dbo.sp_OAMethod @OBJ, 'Open', NULL, 'post', @URL , false
EXEC msdb.dbo.sp_OAMethod @OBJ, 'send'
EXEC msdb.dbo.sp_OAGetProperty @OBJ, 'responseText', @RESPONSE OUT
SELECT @RESPONSE [response]
EXEC msdb.dbo.sp_OADestroy @OBJ
当我使用第一个URL 1时,我得到了所需的响应。但是当我使用URL 2时,会显示以下错误:
System.InvalidOperationException: Request format is invalid .
em System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
em System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
你能告诉我出了什么问题吗?
答案 0 :(得分:2)
使用sp_OAMethod
时使用GET
方法并作为增强功能,您可以尝试按如下方式对存储过程进行参数化设置:
CREATE PROCEDURE [dbo].[sp_CallWebService]
@Param varchar(20) = NULL
AS
DECLARE @obj INT
DECLARE @sUrl VARCHAR(200)
DECLARE @response VARCHAR(8000)
SET @sUrl = 'http://localhost/ws/ws1.asmx/HelloWorld1?a='+ @Param +''
EXEC sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
EXEC sp_OAMethod @obj, 'Open', NULL, 'GET', @sUrl , false
EXEC sp_OAMethod @obj, 'send'
EXEC sp_OAGetProperty @obj, 'responseText', @response OUT
SELECT @response [response]
EXEC sp_OADestroy @obj
RETURN
然后,您可以使用提供的参数执行存储过程:
EXEC [dbo].[sp_CallWebService] 'amana'