经典的Asp Web服务问题

时间:2009-03-06 12:05:43

标签: web-services asp-classic

我正在尝试创建一个代码,以允许现有的经典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获得所有帮助。我会尝试检查假期时间来检查和回复评论,我无疑会遗漏所需的信息。

拜托,像对待白痴一样说话,我是新手,所以我可以更好地理解这种方式。 :)

4 个答案:

答案 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...