无法从Azure虚拟机调用google api


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

好的,所以这在生产,qa和本地主机中工作得很好,直到我们将其移动到Azure VM。我们可以从VM使用浏览器访问https://maps.google.com/maps/api/geocode/xml?sensor=false&address= URL。但是当另一个页面调用getgeocode函数时,结果总是空白,这意味着其他API调用在某种程度上失败了。

我不认为这是域密钥限制,因为a)我没有在这个调用中使用密钥,b)我将我的google api密钥设置为任何域来测试它。编辑:我试过使用另一种服务,结果相同。它可以在开发机器和本地机器上工作,但不能在Azure虚拟机上工作。我不明白的是如何通过浏览器访问REST api,但从代码调用时什么也不返回。什么好主意吗?

显式创建web客户端并将其加载到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

相关内容

  • 没有找到相关文章