2009-03-06 169 views
2

我想创建一个代码来允许现有的经典asp程序使用asp.net web服务。从经典的asp更新不是一种选择,因为我在一家大公司工作,事情就是这样。经典的Asp Web服务问题

我一直浏览大量的教程,据说在这方面有所帮助,但我还没有设法让他们工作。作为初学者,我可能犯了一些明显的错误,但我不知道是什么。

首先,Web服务位于外部服务器上。 “Greeting”方法需要一个String参数,通过它可以确定返回哪个String。输入 “G” 来了procudes此xml:

 
    <?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://server1/Logger_WebService/">Greetings and welcome!</string> 

我承担的XPath用于获取内容要么是 “字符串/ *” 或 “*”?

接下来,我的网络服务本身是这样的:

 
    <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种不同的方式,我试图让它工作,SOAP工具包安装在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的所有帮助。我会尽量检查假期的时间来检查和回复评论,我毫无疑问地遗漏了所需的信息。

请你说话,因为你会对一个白痴,我是新来的这个机会,我可以更好地理解这种方式。 :)

回答

1

一位同事终于得到它把一整天进去后工作。据认为,发送信息比接收信息要容易得多。由于Web服务的最终目的是将数据写入数据库并且不会收到任何消息,因此我们试图通过简单地在Web服务中写入一个文件。需要有

以下变化:

首先,为了得到它,以通过公司网络上运行,匿名访问必须在IIS中启用。

该网站的服务需要在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 

随着我们工作上面,这是一个简单的问题,应用相同的大网站的方法,将解析和检查信息并将其插入到数据库中。

经典的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() 

花了大约一周的工作才得到解决。 :/最难的部分根本就不知道在任何时候都出现了什么问题。

+0

修复程序隐藏在您的答案中:将MSXML2.ServerXMLHTTP更改为MSXML2.XMLHTTP,并且身份验证自动生效。 – user3902302 2016-04-08 14:14:50

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 
1

你可能会考虑写一点.NET包装代码来使用Web服务。然后将.NET代码公开为ASP可以直接调用的COM对象。正如你所看到的,在传统的ASP中没有工具可以帮助你,所以考虑使用尽可能多的.NET来进行工具化。然后,使用COM在两者之间进行互操作。

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