setting soap request properties from T-sql - sql-server

Below is the code I am using to connect to my api server. All works fine for other calls, but when it comes to uploading images, it's not working. If I copy the code into SoapUI and run from there, it does work but in SoapUI I have to change the request property "Enable inline files" to true.
Does anyone knows how I can pass that property value in my below code?
declare
#Url varchar(1024),
#HttpMethod varchar(10),
#ParamsValues varchar(1024),
#SoapAction varchar(8000)
DECLARE #t table (ID int, strxml xml)
set #Url = 'https://api.my.com/api.asmx'
set #HttpMethod = 'soap'
set #SoapAction = '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:apic="http://apiconn.com">
<soap:Header/>
<soap:Body>
<apic:AddBook>
<apic:addbookID>18</apic:addbookID>
<apic:data>file:C:/temp/Book2.csv</apic:data>
<apic:dataType>CSV</apic:dataType>
</apic:AddBook>
</soap:Body>
</soap:Envelope>'
if #HttpMethod in ('get','GET') and len(#ParamsValues) > 0
begin
set #Url = #Url + '?' + #ParamsValues
end
declare #obj int
,#response varchar(8000)
,#responseText varchar(8000)
,#status varchar(50)
,#statusText varchar(1024)
,#method varchar(10) = (case when #HttpMethod in ('soap','SOAP') then 'POST' else #HttpMethod end)
--exec sp_OACreate 'WinHttp.WinHttpRequest.5.1', #obj out
exec sp_OACreate 'MSXML2.ServerXMLHTTP', #obj out
exec sp_OAMethod #obj, 'Open', null, #method, #Url, false
if #HttpMethod in ('get','GET')
begin
exec sp_OAMethod #obj, 'send'
end
else if #HttpMethod in ('post','POST')
begin
exec sp_OAMethod #obj, 'setRequestHeader', null, 'Content-Type', 'application/x-www-form-urlencoded'
exec sp_OAMethod #obj, 'send', null, #ParamsValues
end
else if #HttpMethod in ('soap','SOAP')
begin
if #SoapAction is null
raiserror('#SoapAction is null', 10, 1)
declare #host varchar(1024) = #Url
if #host like 'http://%'
set #host = right(#host, len(#host) - 7)
else if #host like 'https://%'
set #host = right(#host, len(#host) - 8)
if charindex(':', #host) > 0 and charindex(':', #host) < charindex('/', #host)
set #host = left(#host, charindex(':', #host) - 1)
else
set #host = left(#host, charindex('/', #host) - 1)
exec sp_OAMethod #obj, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
exec sp_OAMethod #obj, 'setRequestHeader', null, 'Host', #host
exec sp_OAMethod #obj, 'setRequestHeader', null, 'SOAPAction', #SoapAction
exec sp_OAMethod #obj, 'send', null, #SoapAction
end
Insert into #t (strxml)
exec sp_OAGetProperty #obj, 'responseXML.xml' --, #responseText out
exec sp_OAGetProperty #obj, 'Status', #status out
exec sp_OADestroy #obj
declare #X xml
select #X = strxml from #t
SELECT #X
SELECT #status

Related

SOAP 1.1 request from t-sql

I have copied the code from setting soap request properties from T-sql and make some litle changes.
If soap version 1.2 the code works fine. My problem is that soap version 1.1 wants to load the PELTT01.wsdl file to work.
declare
#Url varchar(1024),
#HttpMethod varchar(10),
#ParamsValues varchar(1024),
#SoapAction varchar(8000),
#datefrom varchar(30),
#dateto varchar(30),
#sessionid as varchar(3000),
#xmlOut1 varchar(8000),
#RequestText as varchar(8000),
#wsdl as varchar(8000),
#responseHeader varchar(4000)
DECLARE #t table (ID int, strxml xml)
set #Url = 'http://212.205.47.226:9003'
set #HttpMethod = 'soap'
set #SoapAction = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pel="/PELTT01">
<soapenv:Header/>
<soapenv:Body>
<pel:READ>
<pel:wpel_code>999999999</pel:wpel_code>
<pel:wpel_user>9999999</pel:wpel_user>
<pel:wpel_pass>9999999</pel:wpel_pass>
<pel:wpel_vg>ZK000000000GR</pel:wpel_vg>
<pel:wpel_ref>?</pel:wpel_ref>
<pel:wpel_flag>1</pel:wpel_flag>
</pel:READ>
</soapenv:Body>
</soapenv:Envelope>'
declare #obj int
,#response varchar(8000)
,#responseText varchar(8000)
,#status varchar(50)
,#statusText varchar(1024)
,#method varchar(10) = (case when #HttpMethod in ('soap','SOAP') then 'POST' else #HttpMethod end)
exec sp_OACreate 'MSXML2.ServerXMLHTTP', #obj out
exec sp_OAMethod #obj, 'Open', null, #method, #Url, 'false'
exec sp_OAMethod #obj, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
exec sp_OAMethod #obj, 'setRequestHeader', null, 'SOAPAction', #SoapAction
exec sp_OAMethod #obj, 'send', null, #SoapAction
exec sp_OAGetProperty #obj, 'responseText', #responseText out
EXECUTE sp_OAMethod #Obj, 'getAllResponseHeaders', #responseHeader OUT
exec sp_OAGetProperty #obj, 'Status', #status out
exec sp_OADestroy #obj
SELECT #status 'status', #responseText 'responsetext', #responseHeader 'Response Header'

Call formsite API from SQL Server

I am trying to call Formsite API from SQL Server to get the data but I am unable to get the data it is returning me null, below is the script which I am using to get the data.
This is my API link (dummy link):
https://fs29.formsite.com/api/v2/xyz/forms/form14/
Access Token (also dummy):
myaccesskey
And the script which I am using is
DECLARE #authHeader NVARCHAR(64);
DECLARE #contentType NVARCHAR(64);
DECLARE #postData NVARCHAR(MAX);
DECLARE #responseText NVARCHAR(MAX);
DECLARE #responseXML NVARCHAR(MAX);
DECLARE #ret INT;
DECLARE #status NVARCHAR(32);
DECLARE #statusText NVARCHAR(32);
DECLARE #token INT;
DECLARE #url NVARCHAR(256);
-- Set Authentications
SET #authHeader = 'Bearer **mykey**';
SET #contentType = 'application/json';
SET #url = 'https://fs29.formsite.com/api/v2/GwYV/forms/form14/' -- Dummy api url
EXEC #ret = sp_OACreate 'MSXML2.XMLHTTP', #token OUT;
SELECT #token
IF #ret <> 0
RAISERROR('Unable to open HTTP connection.', 10, 1);
-- build a request
EXEC #ret = sp_OAMethod #token, 'open', NULL, 'GET', #url, 'false';
EXEC #ret = sp_OAMethod #token, 'setRequestHeader', NULL, 'Authorization', #authHeader;
EXEC #ret = sp_OAMethod #token, 'setRequestHeader', NULL, 'Content-type', #contentType;
EXEC #ret = sp_OAMethod #token, 'setRequestHeader', NULL, 'Cache-Control', 'no-cache' ;
EXEC #ret = sp_OAMethod #token, 'send'
-- Handle response
EXEC #ret = sp_OAGetProperty #token, 'status', #status OUT;
EXEC #ret = sp_OAGetProperty #token, 'statusText', #statusText OUT;
EXEC #ret = sp_OAGetProperty #token, 'responseText', #responseText OUT;
-- Print responses
SELECT #responseText
PRINT 'Status: ' + #status + ' (' + #statusText + ')';
PRINT 'Response text: ' + #responseText;

sp_oagetproperty fails when running using service broker

I have a stored procedure that calls a webservice and gets the response. Initially I had a problem with the responses that are greater than 4000 characters but then I found on the forums the trick of inserting the data into a temp table. This worked perfectly until I incorporated my SP into a db trigger that calls that SP though the service broker. The SP started to fail with an error that the XML is not structured, then I stored the response into a text value (as a log) and I saw that actually the response was again being limited to less than 4000 characters. It's very strange why the same SP works fine when I call it manually and it doesn't when I call it though the service broker. Below is the part from the SP that includes the process I am describing.
declare #obj int
,#responseXml xml
,#status nvarchar(50)
,#statusText nvarchar(1024)
,#method nvarchar(10) = (case when #HttpMethod in ('soap','SOAP') then 'POST' else #HttpMethod end)
exec sp_OACreate 'MSXML2.ServerXMLHttp', #obj out
exec sp_OAMethod #obj, 'Open', null, #method, #Url, false
declare #host nvarchar(1024) = #Url
if #host like 'http://%'
set #host = right(#host, len(#host) - 7)
else if #host like 'https://%'
set #host = right(#host, len(#host) - 8)
if charindex(':', #host) > 0 and charindex(':', #host) < charindex('/', #host)
set #host = left(#host, charindex(':', #host) - 1)
else
set #host = left(#host, charindex('/', #host) - 1)
declare #envelope nvarchar(max) = cast('' as nvarchar(max)) + '<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mob="http://mobility.sce.webservices.infor.com/"><soapenv:Header/><soapenv:Body><mob:{action}><String_1 xmlns="">{params}</String_1></mob:{action}></soapenv:Body></soapenv:Envelope>'
declare #params nvarchar(max) = cast('' as nvarchar(max))
set #envelope = replace(#envelope, '{action}', #SoapAction)
set #envelope = replace(#envelope, '{params}', #ParamsValues)
set #SoapAction = #SoapAction
exec sp_OAMethod #obj, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
exec sp_OAMethod #obj, 'setRequestHeader', null, 'Host', #host
exec sp_OAMethod #obj, 'send', null, #envelope
DECLARE #responseText as table(responseText xml)
exec sp_OAMethod #obj, 'responseXml', #responseXml OUTPUT
INSERT INTO #ResponseText (ResponseText) EXEC sp_OAGetProperty #Obj, 'responseText'
exec sp_OADestroy #obj
I really appreciate your help as I am frustrated and can't find a solution for this.
Thanks in advance and please don't tell me to use CLR

Call Rest TaxJar API from SQL Server Code

I'm working on calling TaxJar API from SQL Server, I saw some articles like:
calling an api from sql server stored-procedure
but unfirtunately I did know how to pass a Token value to the call
Here is a sample of the Get Call I'm making in Poestman:
https://api.taxjar.com/v2/rates/90404-3370
Token: XXXXXXXXXXX
Postman sample
anythoyghts how to do it please?
Thanks
here is a code sample of what i've done so far:
DECLARE
#Result INT,
#Text nVARCHAR(max),
#Obj int,
#HTTPStatus smallint,
#URL Varchar(MAX)
DECLARE #output varchar(255);
DECLARE #hr int;
DECLARE #source varchar(255);
DECLARE #description varchar(255);
SET #Text = '-H "Authorization: Bearer [TOKEN VALUE]'
SET #Url = 'https://api.taxjar.com/v2/rates/90404-3370 \'
EXEC #Result = sp_OACreate 'WinHttp.WinHttpRequest.5.1', #Obj OUT
EXEC #Result = sp_OAMethod #Obj, 'open', NULL, 'GET', #URL, false
EXEC #Result = sp_OAMethod #Obj, 'setRequestHeader', NULL, 'Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'
EXEC #Result = sp_OAMethod #Obj, 'setRequestHeader', NULL, 'Access-Control-Allow-Origin', '*'
EXEC #Result = sp_OAMethod #Obj, 'setRequestHeader', NULL, 'Content-Type', 'application/json'
EXEC #Result = sp_OAMethod #Obj, send, NULL, #Text
EXEC #Result = sp_OAGetProperty #Obj, 'status', #HTTPStatus OUT
PRINT #Result
EXEC #Result = sp_OAGetErrorInfo #obj, #source OUT, #description OUT;
IF #Result = 0
BEGIN
SET #output = ' Source: ' + #source + CHAR(13) + CHAR(10)
SET #output = #output + ' Description: ' + #description
PRINT 'OLE Automation Error Information';
PRINT #output
END
================================================================
UPDATE:
HERE IS MY SQL CODE AND IT WORKED PARTIALLY
DECLARE #authHeader NVARCHAR(64);
DECLARE #contentType NVARCHAR(64);
DECLARE #postData NVARCHAR(MAX);
DECLARE #responseText NVARCHAR(MAX);
DECLARE #responseXML NVARCHAR(MAX);
DECLARE #ret INT;
DECLARE #status NVARCHAR(32);
DECLARE #statusText NVARCHAR(32);
DECLARE #token INT;
DECLARE #url NVARCHAR(256);
-- Set Authentications
SET #authHeader = 'Bearer [TOKEN VALUE]';
SET #contentType = 'application/json';
SET #url = 'https://api.taxjar.com/v2/summary_rates'
EXEC #ret = sp_OACreate 'WinHttp.WinHttpRequest.5.1', #token OUT;
IF #ret <> 0 RAISERROR('Unable to open HTTP connection.', 10, 1);
-- build a request
EXEC #ret = sp_OAMethod #token, 'open', NULL, 'GET', #url, 'false';
EXEC #ret = sp_OAMethod #token, 'setRequestHeader', NULL, 'Authorization', #authHeader;
EXEC #ret = sp_OAMethod #token, 'setRequestHeader', NULL, 'Content-type', #contentType;
EXEC #ret = sp_OAMethod #token, 'setRequestHeader', NULL, 'Cache-Control', 'no-cache' ;
EXEC #ret = sp_OAMethod #token, 'send'
-- Handle responce
EXEC #ret = sp_OAGetProperty #token, 'status', #status OUT;
EXEC #ret = sp_OAGetProperty #token, 'statusText', #statusText OUT;
EXEC #ret = sp_OAGetProperty #token, 'responseText', #responseText OUT;
-- Print responec
PRINT 'Status: ' + #status + ' (' + #statusText + ')';
PRINT 'Response text: ' + #responseText;
THE URL IS RETURNING NOTHING IN SQL BUT IN POSTMAN IT RETURNS VALUES!
Try using this CLR Stored proc https://github.com/geral2/SQL-APIConsumer
DECLARE #Result AS TABLE
(
Token VARCHAR(MAX)
)
INSERT INTO #Result
exec [dbo].[APICaller_POST]
#URL = 'http://localhost:5000/api/auth/login'
,#BodyJson = '{"Username":"gdiaz","Password":"password"}'
DECLARE #Token AS VARCHAR(MAX)
SELECT TOP 1 #Token = CONCAT('Bearer ',Json.Token)
FROM #Result
CROSS APPLY ( SELECT value AS Token FROM OPENJSON(Result)) AS [Json]
EXEC [dbo].[APICaller_GETAuth]
#URL = 'http://localhost:5000/api/values'
, #Token = #Token

Calling a SOAP webservice from TSQL stored procedure

I am trying to build a stored procedure in TSQL to call a webservice. I've done this before in Oracle, but it seems like it's not so easy in MSSQL.
There are of course many reasons not to do this in a stored proc, but since this procedure is only to be used in a daily batch, performance is not too much of a issue.
The thing I want to do is as follows: Send a full name to the webservice, the webservice will return a name divided in things like first name, prefix, lastname, etc. The returned values will need to be written to a table.
I found a interesting procedure at http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure)-using-MSXML.aspx wich seemed to do exactly what I want, but as soon as you add a body to the call, I run into errors like "The parameter is incorrect". This is also stated in the article, and apparently there's no easy solution for it. I definitely need to send a request body.
I also read lots of articles about solving it with CLI or the "Web Service Task Editor", or "SSIS" bit I couldn't find any tutorials about where to start. Right now I only have Microsoft SQL server management studio.
I'm on SQL server 2012 by the way.
Any ideas about what direction I should go with this?
I've already found this description, wich seems pretty clean: http://www.databasejournal.com/features/mssql/article.php/3821271/Calling-a-Web-Service-from-within-SQL-Server.htm However, after installing visual studio 2012 and creating a "SQL server database project", I am unable to choose "Add Web Reference" in the solution context menu, there's just nu such option in the menu.
In the past I have used the following method, it may not be the best method these days but it has worked successfully for me :
DECLARE #obj int,
#url VarChar(MAX),
#response VarChar(MAX),
#requestHeader VarChar(MAX),
#requestBody VarChar(MAX)
SET #url = 'http://....'
SET #requestBody = '<soapenv:Envelope>
<soapenv:Header/>
<soapenv:Body>
...
</soapenv:Body>
</soapenv:Envelope>'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp', #obj OUT
EXEC sp_OAMethod #obj, 'Open', NULL, 'GET', #url, false
EXEC sp_OAMethod #obj, 'setRequestHeader', NULL, 'Content-Type', 'text/xml;charset=UTF-8'
EXEC sp_OAMethod #obj, 'setRequestHeader', NULL, 'SOAPAction', 'POST'
EXEC sp_OAMethod #obj, 'setRequestHeader', NULL, 'Content-Length', LEN(#requestBody)
EXEC sp_OAMethod #obj, 'send', NULL, #requestBody
EXEC sp_OAGetProperty #obj, 'responseText', #response OUT
SELECT #response [RESPONSE]
EXEC sp_OADestroy #obj
I have used this to call a webservice which produces a report and emails it within the method.
Made this monster for my own needs
CREATE PROCEDURE [dbo].[RequestHttpWebService]
#Url varchar(1024),
#HttpMethod varchar(10),
#ParamsValues varchar(1024), -- param1=value&param2=value
#SoapAction varchar(1024) = null
AS
BEGIN
SET NOCOUNT ON;
--set #Url = 'http://localhost/service.asmx'
--set #HttpMethod = 'soap'
--set #ParamsValues = 'login=tr2280&password=Qwe12345&domain=webtech.development'
--set #SoapAction = 'Authenticate'
if #HttpMethod in ('get','GET') and len(#ParamsValues) > 0
begin
set #Url = #Url + '?' + #ParamsValues
end
declare #obj int
,#response varchar(8000)
,#responseXml xml
,#status varchar(50)
,#statusText varchar(1024)
,#method varchar(10) = (case when #HttpMethod in ('soap','SOAP') then 'POST' else #HttpMethod end)
exec sp_OACreate 'MSXML2.ServerXMLHttp', #obj out
exec sp_OAMethod #obj, 'Open', null, #method, #Url, false
if #HttpMethod in ('get','GET')
begin
exec sp_OAMethod #obj, 'send'
end
else if #HttpMethod in ('post','POST')
begin
exec sp_OAMethod #obj, 'setRequestHeader', null, 'Content-Type', 'application/x-www-form-urlencoded'
exec sp_OAMethod #obj, 'send', null, #ParamsValues
end
else if #HttpMethod in ('soap','SOAP')
begin
if #SoapAction is null
raiserror('#SoapAction is null', 10, 1)
declare #host varchar(1024) = #Url
if #host like 'http://%'
set #host = right(#host, len(#host) - 7)
else if #host like 'https://%'
set #host = right(#host, len(#host) - 8)
if charindex(':', #host) > 0 and charindex(':', #host) < charindex('/', #host)
set #host = left(#host, charindex(':', #host) - 1)
else
set #host = left(#host, charindex('/', #host) - 1)
declare #envelope varchar(8000) = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><{action} xmlns="http://tempuri.org/">{params}</{action}></soap:Body></soap:Envelope>'
declare #params varchar(8000) = ''
WHILE LEN(#ParamsValues) > 0
BEGIN
declare #param varchar(256),
#value varchar(256)
IF charindex('&', #ParamsValues) > 0
BEGIN
SET #param = left(#ParamsValues, charindex('&', #ParamsValues) - 1)
set #value = RIGHT(#param, len(#param) - charindex('=', #param))
set #param = left(#param, charindex('=', #param) - 1)
set #params = #params + '<' + #param + '>' + #value + '</'+ #param + '>'
SET #ParamsValues = right(#ParamsValues, LEN(#ParamsValues) - LEN(#param + '=' + #value + '&'))
END
ELSE
BEGIN
set #value = RIGHT(#ParamsValues, len(#ParamsValues) - charindex('=', #ParamsValues))
set #param = left(#ParamsValues, charindex('=', #ParamsValues) - 1)
set #params = #params + '<' + #param + '>' + #value + '</'+ #param + '>'
SET #ParamsValues = NULL
END
END
set #envelope = replace(#envelope, '{action}', #SoapAction)
set #envelope = replace(#envelope, '{params}', #params)
set #SoapAction = 'http://tempuri.org/' + #SoapAction
print #host
print #SoapAction
print #envelope
exec sp_OAMethod #obj, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
exec sp_OAMethod #obj, 'setRequestHeader', null, 'Host', #host
exec sp_OAMethod #obj, 'setRequestHeader', null, 'SOAPAction', #SoapAction
exec sp_OAMethod #obj, 'send', null, #envelope
end
exec sp_OAGetProperty #obj, 'responseText', #response out
exec sp_OADestroy #obj
select #status as [status], #statusText as [statusText], #response as [response]
END
GO
edit: formatting
I ran into this issue as well. Here is the proper way to execute an HTTP Post with parameters from T-SQL:
DECLARE #authHeader NVARCHAR(64);
DECLARE #contentType NVARCHAR(64);
DECLARE #postData NVARCHAR(2000);
DECLARE #responseText NVARCHAR(2000);
DECLARE #responseXML NVARCHAR(2000);
DECLARE #ret INT;
DECLARE #status NVARCHAR(32);
DECLARE #statusText NVARCHAR(32);
DECLARE #token INT;
DECLARE #url NVARCHAR(256);
SET #authHeader = 'BASIC 0123456789ABCDEF0123456789ABCDEF';
SET #contentType = 'application/x-www-form-urlencoded';
SET #postData = 'value1=Hello&value2=World'
SET #url = 'https://requestb.in/16xdq1p1'
-- Open the connection.
EXEC #ret = sp_OACreate 'MSXML2.ServerXMLHTTP', #token OUT;
IF #ret <> 0 RAISERROR('Unable to open HTTP connection.', 10, 1);
-- Send the request.
EXEC #ret = sp_OAMethod #token, 'open', NULL, 'POST', #url, 'false';
EXEC #ret = sp_OAMethod #token, 'setRequestHeader', NULL, 'Authentication', #authHeader;
EXEC #ret = sp_OAMethod #token, 'setRequestHeader', NULL, 'Content-type', #contentType;
EXEC #ret = sp_OAMethod #token, 'send', NULL, #postData;
-- Handle the response.
EXEC #ret = sp_OAGetProperty #token, 'status', #status OUT;
EXEC #ret = sp_OAGetProperty #token, 'statusText', #statusText OUT;
EXEC #ret = sp_OAGetProperty #token, 'responseText', #responseText OUT;
-- Show the response.
PRINT 'Status: ' + #status + ' (' + #statusText + ')';
PRINT 'Response text: ' + #responseText;
-- Close the connection.
EXEC #ret = sp_OADestroy #token;
IF #ret <> 0 RAISERROR('Unable to close HTTP connection.', 10, 1);
Credit goes to the original author.
Edit: The example service I was calling here appears to have shut down. You will need to swap out the URL and post to a different endpoint in order to see it working.
You cannot add a Web Reference in the usual way when maintaining a SQL Server Project in Visual Studio. However, you can use the WSDL Utility to create the Web Interface and add this to your solution. Subsequently, you will then be able to access the Web Methods that you want in your CLR Stored Procedure.
The WSDL.exe utility can be found within the installed Microsoft SDK's, I ran mine using the Windows 7 version but a simple search of your HDD should give you your location, which was installed in the following directory: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
The commands to use when running the WSDL.exe utility are:
WSDL.exe /o:(name of Visual Studio Class file) /n:(name of namespace) (address of webservice)
for example:
WSDL.exe /o:Weather.cs /n:Weather.Test http://wsf.cdyne.com/WeatherWS/Weather.asmx
This will generate a Weather.cs file in this instance which you can then add to your project and call within your method.

Resources