【问题标题】:Bad Request - 400 when using Azure Add Data Disk REST API错误请求 - 使用 Azure 添加数据磁盘 REST API 时出现 400
【发布时间】:2014-01-23 00:46:43
【问题描述】:

我正在构建一个 Java 应用程序来自动化我的应用程序中的一些典型基础架构任务。我成功调用 Azure API,但收到 (400) 错误请求返回代码/消息。我正在eclipse中调试这个,但是在连接对象中找不到任何更有意义的数据。

我尝试做的最初的简单任务是向我的 IaaS 虚拟机“gildev01”添加一个新的数据磁盘。我正在遵循本文档中的指导:http://msdn.microsoft.com/en-us/library/jj157199.aspx

HTTPS URL 正确,以 management.core.windows.net 开头,后跟我的订阅 ID,然后是:

/services/hostedservices/gildev01/deployments/gildev01/roles/gildev01/DataDisks

payload如下:

<DataVirtualHardDisk xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<HostCaching>ReadWrite</HostCaching>
<DiskLabel>java-disklabel-1</DiskLabel>
<DiskName>javadisk1</DiskName>
<LogicalDiskSizeInGB>1000</LogicalDiskSizeInGB>
<MediaLink>http://<myacct>.blob.core.windows.net/vhds/javadisk1.vhd</MediaLink>
</DataVirtualHardDisk>

所以 - 两个问题:

1) 关于我在 URL 或有效负载上做错了什么有什么想法吗?

2) 关于如何从响应对象中获取更多信息的任何建议?

添加 Java 代码:

private String addDataDisk (URL url, String keyStore, String keyStorePassword) throws UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException, IOException {
 SSLSocketFactory sslFactory = getSSLSocketFactory(keyStore, keyStorePassword);
 String requestBody = "<DataVirtualHardDisk xmlns=\"http://schemas.microsoft.com/windowsazure\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><HostCaching>ReadWrite</HostCaching><DiskLabel>java-disklabel-1</DiskLabel><DiskName>javadisk1</DiskName><LogicalDiskSizeInGB>1000</LogicalDiskSizeInGB><MediaLink>http://myacct.blob.core.windows.net/vhds/javadisk1.vhd</MediaLink></DataVirtualHardDisk>");
 HttpsURLConnection con = null;
    con = (HttpsURLConnection) url.openConnection();
    con.setSSLSocketFactory(sslFactory);
    con.setDoOutput(true);
    con.setRequestMethod("POST");
    con.addRequestProperty("x-ms-version", "2013-08-01");
    con.setRequestProperty("Content-Length", String.valueOf(requestBody.length()));
    con.setRequestProperty("Content-Type", "application/xml");

    DataOutputStream  requestStream = new DataOutputStream (con.getOutputStream());
    requestStream.write(requestBody.getBytes());
    requestStream.flush();
    requestStream.close();

    String responseMessage = con.getResponseMessage()+" - "+Integer.toString(con.getResponseCode());

【问题讨论】:

  • 您是在创建一个空的数据盘还是尝试使用现有的 VHD 创建一个新的数据盘?另外我猜你正在用Java编写代码。可以分享一下代码吗?
  • 创建一个空的数据磁盘 - 实际上,假设你是 Cynapta 的同一个 Guarav 创始人 - 这是来自你的博客,适用于简单的启动/停止 vm ...尝试添加代码

标签: rest azure


【解决方案1】:

是的,同一个人:)

根据文档:

选项 1 – 通过指定 磁盘标签和磁盘映像的位置。

  • 请勿在请求正文中包含 DiskName 和 SourceMediaLink 元素。

  • 包含 MediaLink 元素并引用与角色位于同一地理区域的 blob。

  • 您也可以省略 MediaLink 元素。在这种用法中,Windows Azure 将在配置为的存储帐户中创建数据磁盘 角色的默认值。

您可以尝试从您的请求正文中删除&lt;DiskName&gt; 元素,看看是否可行?

也不确定如何在 Java 中执行此操作,但是当您收到 400 异常时,如果您解析响应正文,您应该会看到详细的错误消息。例如,在 .Net 中,我们会这样做:

        catch (WebException webEx)
        {
            using (var resp = (HttpWebResponse)webEx.Response)
            {
                using (var respStreamReader = new StreamReader(resp.GetResponseStream()))
                {
                    var errorMessage = respStreamReader.ReadToEnd();//errorMessage will be XML containing detailed error message.
                }
            }
        }

更新

所以我只是尝试使用API​​创建一个空数据盘,我在两种情况下得到400错误:

  1. 如果我不将内容类型设置为application/xml
  2. 如果我在请求正文中包含 &lt;DiskName&gt; 元素。一旦我删除了这个元素,我就能够成功地创建一个数据磁盘。因此,您的请求正文不应包含此元素。

更新 2

端点:https://management.core.windows.net/&lt;subscriptionid&gt;/services/hostedservices/&lt;cloudservicename&gt;/deployments/&lt;deploymentname&gt;/roles/&lt;rolename&gt;/DataDisks

x-ms-版本:2013-08-01

XML 请求:

<DataVirtualHardDisk xmlns=""http://schemas.microsoft.com/windowsazure"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">
<HostCaching>ReadWrite</HostCaching>
<DiskLabel>java-disklabel-1</DiskLabel>
<LogicalDiskSizeInGB>1000</LogicalDiskSizeInGB>
<MediaLink>http://account.blob.core.windows.net/vhds/javadisk1.vhd</MediaLink>
</DataVirtualHardDisk>

【讨论】:

  • 哇——喜欢你的博客! ...所以我尝试删除 DiskName 和 MediaLink 标签,但仍然收到错误的请求。据我所知,是 con.getOutputStream 方法会引发异常 - 只会引发 IOException 并且当我放入 try/catch 时不会发生这种情况。
  • 只需删除 DiskName 并留下 MediaLink 标签。
  • 抱歉 - 可能没有说清楚:我尝试先删除 DiskName 并留下不起作用的 MediaLink。然后我尝试删除两者 - 仍然没有工作。
  • 应该可以的。媒体链接元素中指定的存储帐户是否属于同一个订阅?
  • Guarav - 你能分享你的 URL 并请求 xml 吗?另外 - 您是否将 x-ms-version 设置为“2012-03-01”或以后的日期?
猜你喜欢
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2021-02-24
  • 1970-01-01
相关资源
最近更新 更多