2009-03-06 217 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...