Проблема классического веб-сервиса Asp - PullRequest
2 голосов
/ 06 марта 2009

Я пытаюсь создать код, позволяющий существующей классической программе asp использовать веб-сервис asp.net. Обновление с классического asp не вариант, так как я работаю в большой компании и все так, как есть.

Я просматривал множество учебных пособий, предположительно, помогающих в этом, но мне пока не удалось заставить их работать. Как новичок, я мог совершить некоторые очевидные ошибки, но я просто не знаю, что.

Во-первых, веб-сервис расположен на внешнем сервере. Метод "Приветствие" нуждается в параметре 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

Веб-сервис работает нормально из обычного решения asp.net.

Теперь вот проблема, классический asp-код выглядит следующим образом (4 различных способа, которыми я пытался заставить это работать, набор инструментов SOAP установлен на сервере веб-службы, все примеры взяты и изменены из учебных пособий):

'******* 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 требовал от меня ввода этого Msgstr "[ServiceVariableName] .Credentials = System.Net.CredentialCache.DefaultCredentials". Я делаю это из сети компании, и есть некоторые проблемы с безопасностью и авторизацией.

Мне нужно только иметь возможность отправлять информацию в любом случае, а не получать, поскольку фактический метод, который я буду использовать, будет вставлять информацию в базу данных. Но на данный момент, просто заставить работать Hello World, кажется, достаточно сложно. :)

Спасибо за помощь. Я постараюсь вернуться в нерабочие часы, чтобы проверить и ответить на комментарии, я, несомненно, оставил необходимую информацию.

Пожалуйста, говорите, как вы, с идиотом, я новичок в этом, так что скорее всего, я смогу лучше понять таким образом. :)

Ответы [ 4 ]

1 голос
/ 11 марта 2009

Коллега наконец заработал, потратив на это целый день. Было решено, что отправлять информацию намного проще, чем получать. Поскольку конечной целью веб-службы является запись данных в БД, а не возвращение какого-либо сообщения, мы попытались это сделать, просто записав файл в веб-службу.

Требуются следующие изменения:

Во-первых, чтобы заставить его работать через сети компании, в IIS должен быть включен анонимный доступ.

Веб-службе потребовалось следующее изменение в файле web.config:

<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

Поскольку вышеперечисленное сработало, было просто применить его к методу большой сети, который будет анализировать и проверять информацию и вставлять ее в базу данных.

Классический сам по себе 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()

Потребовалось около недели работы, чтобы решить эту проблему. : / Самым сложным было просто не знать, что было не так в любое время.

1 голос
/ 06 марта 2009

Вы можете написать немного кода оболочки .NET для использования веб-службы. Затем представьте код .NET как COM-объект, который ASP может вызывать напрямую. Как вы видели, в классическом ASP нет инструментов, которые могли бы вам помочь, поэтому подумайте об использовании как можно большего количества .NET для этого инструмента. Затем используйте COM для взаимодействия между ними.

0 голосов
/ 09 марта 2009

Может потребоваться перепроверить версию компонентов MSXML. Вы используете проверку подлинности Windows? Я заметил некоторые странные проблемы с синтаксическим анализом XML в IIS 7, Classic ASP и MSXML.

Это также поможет получить полезную ошибку. Проверьте ** 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...
0 голосов
/ 06 марта 2009

Возможно, вам не хватает заголовка 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
...