2009-03-06 10 views
2

기존의 고전 ASP 프로그램이 asp.net 웹 서비스를 사용할 수 있도록 코드를 만들려고합니다. 고전적인 ASP에서 업데이트하는 것은 옵션이 아닙니다. 저는 큰 회사에서 일하고 있고, 상황은 그대로입니다.클래식 ASP 웹 서비스 문제

나는 이것에 도움이되는 자습서 덩어리를 탐색했지만, 아직 작동하지 못했습니다. 초급자로서 나는 명백한 실수를했을 수도 있지만, 나는 무엇을 모르고있다.

먼저 웹 서비스는 외부 서버에 있습니다. "Greeting"메소드에는 어떤 String을 돌려 보낼지를 결정하는 String 매개 변수가 필요합니다. 나는이 중 하나 "문자열/*"또는 "*"내용을 얻기 위해 XPath를 가정

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

: 여기에 "g"를 입력이 XML을 procudes?

다음, 내 웹 서비스 자체는 다음과 같습니다

 
    <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 

웹 서비스는 일반 asp.net 솔루션에서 잘 작동합니다.

여기에 문제가 있습니다. 고전적인 ASP 코드는 다음과 같습니다. (SOAP Toolkit은 웹 서비스 서버에 설치되어 있으며 튜토리얼에서 수정 된 모든 예제가 있습니다.)

 
'******* 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 

나는 왜 아무것도 작동하지 않는지, 나는 여러 가지 다른 설정 등이로드 된 모든 방법으로 시도했다. 가능한 한 가지 문제는 웹 서비스가 ASP.Net에서 필요한 서버에 있다는 것입니다. 이 "[ServiceVariableName] .Credentials = System.Net.CredentialCache.DefaultCredentials"를 입력하십시오. 회사 네트워크 내에서이 작업을 수행하며 보안 및 권한 부여 문제가 있습니다.

실제로 사용하는 실제 방법은 정보를 데이터베이스에 삽입하기 때문에 정보를 보내고받을 수 있어야합니다. 하지만 지금은 Hello World를 작동시키는 것만으로도 충분한 도전을 제공하는 것 같습니다. :)

모든 도움을 얻으려면 Thx. 나는 체크하고 답장하기 위해 공휴일을 다시 체크하려고 노력할 것이다. 나는 의심 할 여지없이 필요한 정보를 빠뜨렸다.

바보처럼 말하십시오. 저는이 말을 처음 접했기 때문에 그렇게 잘 이해할 수 있습니다. :)

답변

1

동료는 마침내 그것으로 하루 종일 퍼팅 후 작업을 얻었다. 그것을받는 것보다 정보를 보내는 것이 훨씬 쉽다는 것이 결정되었습니다. 웹 서비스의 궁극적 인 목적은 DB에 데이터를 쓰고 메시지를 다시 얻지 않기 때문에 우리는 파일을 웹 서비스에 쓰려 고 시도했다.

다음과 같은 변경이 필요했다 :

첫째, 회사의 네트워크를 통해 작동하도록하기 위해, 익명 액세스는 IIS에서 활성화되어야했다. 과 같이 변경되었습니다

 
<webServices> 
    <protocols> 
    <add name="HttpGet"/> 
    </protocols> 
</webServices> 

그리고 웹 서비스 코드 숨김 :

 
<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.config에서 다음과 같이 변경 필요 정보를 파싱하고 검사하여 데이터베이스에 삽입하는 것은 큰 웹 메소드에 똑같이 적용하는 간단한 문제였습니다.

가장 큰 문제였던 이전 페이지에 추가해야하는 고전적인 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

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 래퍼 코드의 비트를 작성하는 것이 좋습니다 다음은 작업 예입니다. 그런 다음 .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...