2014-12-26 18 views
5

Tôi có một web-dịch vụ với các phương pháp sau (C#):Gọi một dịch vụ Web bên trong máy chủ sql

[WebMethod] 
    public string HelloWorld1(string a) 
    { 
     return "Hello World - " + a.ToString(); 
    } 

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

Tôi đang cố gắng sử dụng nó bên trong một thủ tục sql-server với đoạn mã sau:

... 

-- 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 

Khi tôi sử dụng URL đầu tiên 1, tôi nhận được phản hồi mong muốn. Nhưng khi tôi sử dụng URL 2, lỗi sau đây được hiển thị:

System.InvalidOperationException: Request format is invalid . 
    em System.Web.Services.Protocols.HttpServerProtocol.ReadParameters() 
    em System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest() 

Bạn có thể vui lòng cho tôi biết có vấn đề gì không?

Trả lời

2

Khi sử dụng sp_OAMethod sử dụng phương pháp GET và như một nâng cao, bạn có thể thử parameterising các thủ tục lưu trữ như sau:

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 

Sau đó, bạn có thể thực hiện các thủ tục lưu trữ với các đối số cung cấp:

EXEC [dbo].[sp_CallWebService] 'amana' 
Các vấn đề liên quan