Невозможно вызвать Google API из виртуальной машины Azure.

Public Class Geocode
Public Structure GeocodeResult
    Public Latitude As String
    Public Longitude As String
    Public Result As String
End Structure


Public Shared Function GetGeocode(ByVal Address As String) As GeocodeResult
    Dim strLat As String = ""
    Dim strLon As String = ""
    Dim strResult As String = ""
    Dim oXmlDoc As Object
    GetGeocode.Latitude = ""
    GetGeocode.Longitude = ""
    GetGeocode.Result = ""
    Try
        Dim baseURL As String = "https://maps.google.com/maps/api/geocode/xml?sensor=false&address=" & Address
        baseURL = Replace(baseURL, " ", "+")
        oXmlDoc = CreateObject("Microsoft.XMLDOM")
        With oXmlDoc
            .Async = False
            If .Load(baseURL) And Not .selectSingleNode("GeocodeResponse/status") Is Nothing Then
                GetGeocode.Result = .selectSingleNode("GeocodeResponse/status").Text
                If Not .selectSingleNode("GeocodeResponse/result") Is Nothing Then
                    GetGeocode.Latitude = .selectSingleNode("//location/lat").Text
                    GetGeocode.Longitude = .selectSingleNode("//location/lng").Text
                    Return GetGeocode
                End If
            End If
        End With
        oXmlDoc = Nothing
        Return GetGeocode
        Exit Function
    Catch ex As Exception
        Throw (ex)
    End Try
    Return GetGeocode
End Function
End Class

Итак, это хорошо работает в production, qa и localhost, пока мы не переместим его на виртуальную машину Azure. С виртуальной машины мы можем перейти с помощью браузера, чтобы перейти на https://maps.google.com/maps/api/geocode/xml?sensor=false&address= URL. но когда другая страница вызывает функцию getgeocode, результаты всегда остаются пустыми, что означает, что вызов остальных API-интерфейсов каким-то образом не удался

Я не думаю, что это ограничения ключа домена, потому что а) я не использую ключ в этом вызове и б) я установил свой ключ API Google для любого домена, чтобы проверить его. РЕДАКТИРОВАТЬ: я пытался использовать другой сервис с тем же результатом. Он работает в dev и на локальных машинах, но не на виртуальных машинах Azure. Я не понимаю, как API REST доступны через браузер, но ничего не возвращают при вызове из кода. Есть идеи?

1 ответ

Явное создание веб-клиента и загрузка его в документ XML устранила эту проблему для меня.

Imports Microsoft.VisualBasic
Imports System.Xml
Imports System.Linq
Imports System.Xml.Linq
Imports System.Net
Imports System.IO

Public Class Geocode
    Public Structure GeocodeResult
        Public Latitude As String
        Public Longitude As String
        Public Result As String
    End Structure


    Public Shared Function GetGeocode(ByVal Address As String) As GeocodeResult
        Dim oXmlDoc As Object
        GetGeocode.Latitude = ""
        GetGeocode.Longitude = ""
        GetGeocode.Result = ""
        Try
            Dim baseURL As String = "https://maps.google.com/maps/api/geocode/xml?sensor=false&address=" & Address
            baseURL = Replace(baseURL, " ", "+")
            Using WC As New WebClient()
                oXmlDoc = CreateObject("Microsoft.XMLDOM")
                With oXmlDoc
                    .Async = False
                    If .Load(WC.DownloadData(baseURL)) And Not .selectSingleNode("GeocodeResponse/status") Is Nothing Then
                        GetGeocode.Result = .selectSingleNode("GeocodeResponse/status").Text
                        If Not .selectSingleNode("GeocodeResponse/result") Is Nothing Then
                            GetGeocode.Latitude = .selectSingleNode("//location/lat").Text
                            GetGeocode.Longitude = .selectSingleNode("//location/lng").Text
                            Return GetGeocode
                        End If
                    End If
                End With
                oXmlDoc = Nothing
            End Using

            Return GetGeocode
            Exit Function
        Catch ex As Exception
            Throw (ex)
        End Try
        Return GetGeocode
    End Function
End Class
Другие вопросы по тегам