关于java:Azure存储Blob:https://(storageAccountName).blob.core.windows.net / vhd?restype = container& comp = list无法使用代理

Azure Storage Blob : https://(storageAccountName).blob.core.windows.net/vhd?restype=container&comp=list not working using proxy

为了获取blob容器的详细信息,我们使用下面提到的rest api。vhd是blob容器名。

https://(storageAccountName).blob.core.windows.net/vhd?restype=container&comp=list

当我们使用代理服务器详细信息(例如:squid proxy)访问storage rest api调用时,我们会得到下面提到的错误。

HttpResponse for Blobs:: ResourceNotFoundThe
specified resource does not exist.
RequestId:6dc7e6f2-0001-000d-30f9-d56eb3000xxx

如果我们在不使用代理服务器的情况下访问同一个RESTAPI,我们将得到有效的响应,并且它正在工作。


我们找到了解决办法。问题是我们一次调用所有存储帐户的异步调用。例如:如果我们有5个存储帐户,每个存储帐户有5个VHD容器,如果我们一次调用所有5个,并且回调等待5个响应,那么在这种情况下,它将不起作用。所以我们分别调用每个调用,它开始工作了。


根据我的经验,通常情况下,使用squid作为后端服务的反向代理,但这里您希望通过squid作为正向代理访问存储REST API。您可以参考wiki页面https://en.wikipedia.org/wiki/proxy_server,了解代理服务器和反向代理服务器之间的so线程差异以及博客之间的差异。

因此,问题的解决方案是将代理服务器配置为转发代理。

  • 对于squid,您可以尝试参考squid wiki页面http://wiki.squid-cache.org/squidfaq/configuringsquid和http://wiki.squid-cache.org/features/https了解如何使用https配置为Forword代理。

  • 对于Apache,您可以尝试参考Apache文档页面http://httpd.apache.org/docs/2.0/mod/mod_proxy.html forwardReverse to do。

  • 然后,在成功设置转发代理后,为Java设置系统属性以启用代理支持。

    支持Java的代理有两种方式。

  • 命令行JVM设置:代理设置通过命令行参数提供给JVM:

    1
    java -Dhttp.proxyHost=proxyhostURL -Dhttp.proxyPort=proxyPortNumber -Dhttp.proxyUser=someUserName -Dhttp.proxyPassword=somePassword HelloWorldClass
  • 在代码中设置系统属性:在Java代码中添加以下行,以便JVM使用代理进行HTTP调用。

    1
    2
    3
    4
    System.setProperty("http.proxyPort","someProxyPort");
    System.setProperty("http.proxyUser","someUserName");
    System.setProperty("http.proxyPassword","somePassword");
    System.setProperty("http.proxyHost","someProxyURL");
  • 请参阅HTTP://DOCS.Oracle .COM/JavaSe/7/DOCS/TeTeNeSe/GueSe/NET/PROXII.HTML和HTTP://DOCS.Oracle .COM/JavaSe/7/DOCS/TeTeNeSe/GueSe/NET/PrimeTys.HTML。