我正在尝试创建一个代码,以允许现有的经典asp程序使用asp.net Web服务。从经典的asp更新不是一种选择,因为我在一家大公司工作,事情就是这样。
我一直在浏览一大堆据说有帮助的教程,但我还没有设法让它们继续工作。作为初学者,我可能会犯一些明显的错误,但我只是不知道是什么。
首先,Web服务位于外部服务器上。方法“Greeting”需要一个String参数,通过该参数确定返回哪个String。输入“g”来生成这个xml:
<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://server1/Logger_WebService/">Greetings and welcome!</string>
我假设获取内容的xpath是“string / *”或“*”?
接下来,我的网络服务本身如下:
<WebMethod()> _ Public Function Greeting(ByVal stringel As String) As String If stringel.ToLower = "g" Then Return "Greetings and welcome!" Else Return "Bye then!" End If End Function
Web服务在常规的asp.net解决方案中运行良好。
现在问题在于,经典的asp代码看起来像这样(我尝试过4种不同的工作方式,Web工具包安装在Web服务服务器上,所有示例都是从教程中获取和修改的):
'******* USING GET METHOD Dim wsurl="http://server1/Logger_WebService/service.asmx/Greeting?g" Dim xmlhttp Set xmlhttp=Server.CreateObject("MSXML2.ServerXMLHTTP") xmlhttp.open "GET",wsurl,false xmlhttp.send Dim rValue 'rValue=xmlhttp.responseXML.selectSingleNode("string") 'use XPATH as input argument ' or you can get response XML rValue=xmlhttp.responseXML Set xmlhttp=nothing '------------------------------------------------------ '******* USING POST METHOD Dim wsurl="http://server1/Logger_WebService/service.asmx/Greeting" Dim xmlhttp Set xmlhttp=Server.CreateObject("MSXML2.ServerXMLHTTP") xmlhttp.open "POST",wsurl,false xmlhttp.send "stringeli=g" Dim rValue rValue=xmlhttp.responseXML.selectSingleNode("string") ' or you can get response XML ' rValue=xmlhttp.responseXML Set xmlhttp=nothing '------------------------------------------------------ Response.Write consumeWebService() Function consumeWebService() Dim webServiceUrl, httpReq, node, myXmlDoc webServiceUrl = "http://server1/Logger_WebService/service.asmx/Greeting?stringel=g" Set httpReq = Server.CreateObject("MSXML2.ServerXMLHTTP") httpReq.Open "GET", webServiceUrl, False httpReq.Send Set myXmlDoc =Server.CreateObject("MSXML.DOMDocument") myXmlDoc.load(httpReq.responseBody) Set httpReq = Nothing Set node = myXmlDoc.documentElement.selectSingleNode("string/*") consumeWebService = " " & node.text End Function '------------------------------------------------------ Response.Write(Helou()) Public Function Helou() SET objSoapClient = Server.CreateObject("MSSOAP.SoapClient") objSoapClient.ClientProperty("ServerHTTPRequest") = True ' needs to be updated with the url of your Web Service WSDL and is ' followed by the Web Service name Call objSoapClient.mssoapinit("http://server1/Logger_WebService/service.asmx?WSDL", "Service") ' use the SOAP object to call the Web Method Required Helou = objSoapClient.Greeting("g") End Function
我真的不知道为什么没有任何效果,我已经尝试了各种不同设置的方式等等。一个可能的问题是Web服务位于服务器上,ASP.Net要求我输入这个“[ServiceVariableName] .Credentials = System.Net.CredentialCache.DefaultCredentials”。我是在公司网络内部执行此操作,并且存在一些安全和授权问题。
我只需要能够以任何方式发送信息,而不是接收,因为我将使用的实际方法是将信息插入数据库。但就目前而言,让Hello World的东西上班似乎提供了足够的挑战。 :)
Thx获得所有帮助。我会尝试检查假期时间来检查和回复评论,我无疑会遗漏所需的信息。
拜托,像对待白痴一样说话,我是新手,所以我可以更好地理解这种方式。 :)
答案 0 :(得分:1)
您可以考虑编写一些.NET包装器代码来使用Web服务。然后将.NET代码公开为ASP可以直接调用的COM对象。正如您所见,没有工具可以帮助您使用经典ASP,因此请考虑尽可能多地使用.NET来实现工具。然后,使用COM在两者之间进行互操作。
答案 1 :(得分:1)
一位同事在花了一整天的时间后终于开始工作了。决定发送信息比接收信息更容易。由于Web服务的最终目的是将数据写入数据库而不收回任何消息,因此我们只需在Web服务中编写一个文件即可尝试。
需要进行以下更改:
首先,为了让它在公司网络中运行,必须在IIS中启用匿名访问。
Web服务需要在web.config中进行以下更改:
<webServices> <protocols> <add name="HttpGet"/> </protocols> </webServices>
Web服务代码隐藏的改变如下:
<WebMethod()> _ Public Function Greeting(ByVal stringel As String) As String Dim kirj As StreamWriter 'kirj = File.CreateText("\\server1\MyDir\Logger_WebService\test.txt") 'if run locally, the line above would need to be used, otherwise the one below kirj = File.CreateText("C:\Inetpub\serverroot\MyDir\Logger_WebService\test.txt") kirj.WriteLine(stringel) kirj.Close() kirj.Dispose() Return stringel End Function
当我们完成上述工作时,将一个简单的问题应用于解析和检查信息并将其插入数据库的大型Web方法。
需要添加到旧页面的经典asp代码本身,这是最大的问题,最终结果相对简单。
function works() message = "http://server1/mydir/logger_webservice/service.asmx/Greeting?" & _ "stringel=" & "it works" Set objRequest = Server.createobject("MSXML2.XMLHTTP") With objRequest .open "GET", message, False .setRequestHeader "Content-Type", "text/xml" .send End With works = objRequest.responseText end function works()
花了大约一周的时间来解决这个问题。 :/最困难的部分根本就不知道任何时候出了什么问题。
答案 2 :(得分:0)
您可能缺少SOAPAction标头。这是一个有效的例子:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class GreetingService : WebService
{
[WebMethod]
public string Greet(string name)
{
return string.Format("Hello {0}", name);
}
}
调用VBS脚本:
Dim SoapRequest
Set SoapRequest = CreateObject("MSXML2.XMLHTTP")
Dim myXML
Set myXML = CreateObject("MSXML.DOMDocument")
myXML.Async=False
SoapRequest.Open "POST", "http://localhost:4625/GreetingService.asmx", False
SoapRequest.setRequestHeader "Content-Type","text/xml;charset=utf-8"
SoapRequest.setRequestHeader "SOAPAction", """http://tempuri.org/Greet"""
Dim DataToSend
DataToSend= _
"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:tem=""http://tempuri.org/"">" & _
"<soapenv:Header/>" & _
"<soapenv:Body>" & _
"<tem:Greet>" & _
"<tem:name>John</tem:name>" & _
"</tem:Greet>" & _
"</soapenv:Body>" & _
"</soapenv:Envelope>"
SoapRequest.Send DataToSend
If myXML.load(SoapRequest.responseXML) Then
Dim Node
Set Node = myXML.documentElement.selectSingleNode("//GreetResult")
msgbox Node.Text
Set Node = Nothing
End If
Set SoapRequest = Nothing
Set myXML = Nothing
答案 3 :(得分:0)
可能要仔细检查MSXML组件的版本。您使用的是Windows身份验证吗?我注意到了IIS 7,Classic ASP和MSXML的一些奇怪的XML解析问题。
这也有助于获得有用的错误。检查** myXML.parseError.errorCode **,如果它不是0,则写出错误。
参考代码:
If (myXML.parseError.errorCode <> 0) then
Response.Write "XML error: " & myXML.parseError.reason
Else
'no error, do whatever here
End If
'You get the idea...