2016-02-25 129 views
2

我有一个经典的asp文件需要连接到一个web服务。 我很困惑如何定义Web服务的URL和SOAPAction中的名称空间。 当我运行代码并为我在Web服务中调用的方法的返回值编写Response.Write时,它将返回wsdl或服务的网页使用ServerXMLHTTP连接到Web服务

此代码显示web服务html为如果你正在输入Web服务的.svc网址:

Dim strSoapReq 
strSoapReq = "<?xml version=""1.0"" encoding=""utf-8"" ?>" 
strSoapReq = strSoapReq & "<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">" 
strSoapReq = strSoapReq & "<s:Body>" 

strSoapReq = strSoapReq & "<TestMethod xmlns=""http:<serverName:<port>/PagingService/PagingService"">" 
strSoapReq = strSoapReq & "</TestMethod>" 
strSoapReq = strSoapReq & "</s:Body>" 
strSoapReq = strSoapReq & "</s:Envelope>" 

'Create server-side component to make requests 
Set httpRequest = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")  
URL = "http:<serverName:<port>/PagingService/PagingService.Paging.svc" 

httpRequest.Open "GET", URL, False 
httpRequest.setRequestHeader "Content-Type", "text/xml; charset=utf-8" 
httpRequest.setRequestHeader "SOAPAction", URL & "/TestMethod" 
httpRequest.Send(strSoapReq) 

Dim strResult 
strResult = httpRequest.responseText 
Response.Write(vbCrLf & "Result from web service call: " & vbCrLf & strResult) 

如果我添加了?wsdl到服务URL的末尾,它显示了WSDL。 如何在Web服务中调用方法?

UPDATE 我改变了我的代码如下:

Dim NS, NS_SOAP, NS_SOAPENC, NS_XSI, NS_XSD 
NS = "http://<server>/PagingService/" 
NS_SOAP = "http://schemas.xmlsoap.org/soap/envelope/" 
NS_SOAPENC = "http://schemas.xmlsoap.org/soap/encoding" 
NS_XSI = "http://www.w3.org/2001/XMLSchema-instance" 
NS_XSD = "http://www.w3.org/2001/XMLSchema" 

Set httpRequest = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")  
URL = "http://<server>/PagingService/PagingService.Paging.svc?WSDL" 

httpRequest.Open "POST", URL, False 
httpRequest.setRequestHeader "Content-Type", "text/xml; charset=utf-8"  
httpRequest.setRequestHeader "SOAPAction", "http://<server>/PagingService/TestMethod" 

' XML DOM objects. 
Dim DOM, Envelope, Body, Operation, Param 

' Creates an XML DOM object. 
Set DOM = CreateObject("MSXML2.DOMDocument.6.0") 

' Creates the main elements. 
Set Envelope = DOM.createNode(1, "soap:Envelope", NS_SOAP) 
Envelope.setAttribute "xmlns:soapenc", NS_SOAPENC 
Envelope.setAttribute "xmlns:xsi", NS_XSI 
Envelope.setAttribute "xmlns:xsd", NS_XSD 
DOM.appendChild Envelope 
Set Body = DOM.createElement("soap:Body") 
Envelope.appendChild Body 

' Creates an element for the TestMethod function. 
Set Operation = DOM.createNode(1, "TestMethod", NS) 
Body.appendChild Operation 

' Releases the objects. 
Set Operation = Nothing 
Set Body = Nothing 
Set Envelope = Nothing 

httpRequest.Send(DOM.xml) 

Dim strResult 
strResult = httpRequest.status 
Response.Write(vbCrLf & "Result from web service call: " & vbCrLf & strResult) 

的http.Status这段代码的结果是:415 - 不支持的媒体 我看到这个错误后,他们被纠正之后,改变了Content-Type。当我试过这个: httpRequest.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8"

我得到了400的状态值 - 错误的请求。

+0

如果您在标头中忽略charset = utf-8,会发生什么情况? – Sourcery

+0

所以它应该阅读:'httpRequest.setRequestHeader“Content-Type”,“text/xml”'? –

+0

所以,我改变了上面的一行,没有改变。另外,我尝试在'Open'语句中使用'GET'和'POST'。 'GET'返回描述Web服务的wsdl或网站。 'POST'不会返回任何内容。也没有错误。 –

回答

1

终于想出了这一个。下面是我的代码,以防一些可怜的奴才需要这样做......也许这会减轻痛苦并缩短让它运行的时间。 我将WCF Web服务(文件扩展名为.svc)连接到经典的.asp文件。 我不得不添加一个basicHttpBinding到Web服务。它也可以是安全的(HTTPS)。 这是添加到服务配置的绑定。文件: (注意它的名字由address属性定义

<endpoint address="basic" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IPaging" contract="PagingService.IPaging"> 
</endpoint> 

将此添加到配置文件的bindings部分:

<basicHttpBinding> 
    <binding name="BasicHttpBinding_IPaging"></binding> 
</basicHttpBinding> 

您需要重新编译项目,以便在WSDL有这个绑定在它的定义中 现在有趣的部分....经典的asp :(用VBScript编写的) SOAP信封给了我最多的麻烦:

'Namespaces 
Dim NS, NS_SOAP, NS_SOAPENC, NS_XSI, NS_XSD, NS_SOAP_ACTION 
'NS is the name of YOUR namespace. If you did not define it 
'in the service interface it is probably the same as this 
NS = "http://tempuri.org/" 
'It is for SOAP 1.1 - my version of .asp could only use SOAP 1.1 
NS_SOAP = "http://schemas.xmlsoap.org/soap/envelope/" 
'Next 3 definitions are standard - just copy 
NS_SOAPENC = "http://schemas.xmlsoap.org/soap/encoding" 
NS_XSI = "http://www.w3.org/2001/XMLSchema-instance" 
NS_XSD = "http://www.w3.org/2001/XMLSchema" 
'This should also be in your WSDL. Look up the method you 
'want to call; there was an attribute in mine that read 'soap_action' 
NS_SOAP_ACTION = "http://tempuri.org/IFileName/<YourMethodName>" 

'URL to the WCF service Using basicHttpBinding identified to the name 
'you defined in the config file in 'address' attribute 
URL = "https://<serverName>:<port>/ServiceFolder/Service.Paging.svc/basic" 

'This was the hard part for me. Defining the damn soap message 
'XML DOM objects. 
Dim Envelope, Body, Operation 
Dim ParamUserID, ParamUserName, 

'Creates an XML DOM object. 
Set objXmlDoc = CreateObject("MSXML2.DOMDocument.6.0") 
objXmlDoc.async = false 

'Creates the main elements. 
Set Envelope = objXmlDoc.createNode(1, "soap:Envelope", NS_SOAP) 
Envelope.setAttribute "xmlns:soapenc", NS_SOAPENC 
Envelope.setAttribute "xmlns:xsi", NS_XSI 
Envelope.setAttribute "xmlns:xsd", NS_XSD 
objXmlDoc.appendChild Envelope 

Set Body = objXmlDoc.createNode(1, "Body", NS_SOAP) 
Envelope.appendChild Body 

'Creates an element for the SendPageForGalvanonSystem function. 
Set Operation = objXmlDoc.createNode(1, "<MethodName>", NS) 
Body.appendChild Operation 

'Add all the parameters to the DOM 
Set ParamUserID = objXmlDoc.createNode(1, "strUserID", NS) 
ParamUserID.text = strUserID 
Operation.appendChild ParamUserID 

Set ParamUserName = objXmlDoc.createNode(1, "strUserName", NS) 
ParamUserName.text = strUserName 
Operation.appendChild ParamUserName 

Set httpRequest = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0") 
httpRequest.Open "POST", URL, False   
httpRequest.setRequestHeader "Content-Type", "text/xml"  
httpRequest.setRequestHeader "SOAPAction", NS_SOAP_ACTION 
httpRequest.send objXmlDoc.xml 

'Releases the objects. 
Set ParamUserID = Nothing 
Set ParamUserName = Nothing 
Set Operation = Nothing 
Set Body = Nothing 
Set Envelope = Nothing