Хранилище BLOB-объектов Azure: невозможно отправить BLOB-объект размером 0

Наше приложение требует загрузки большого двоичного объекта размером 0. Мы используем cURL для вызова REST API хранилища Azure. При загрузке с размером не удалось отобразить код ошибки HTTP [400].

Следующее сообщение об ошибке вернулось


<?xml version="1.0" encoding="utf-8"?>
    <Error>  
           <Code>InvalidHeaderValue</Code>
           <Message>
                  The value for one of the HTTP headers 
                  is not in the correct format.
                  RequestId:2b1ec18b-0001-007d-7811-e40725000000
                  Time:2016-07-22T12:07:28.5435467Z
          </Message>
          <HeaderName>Content-Length</HeaderName>
          <HeaderValue>-1</HeaderValue>
          </Error>

С помощью wirehark мы убедились, что значение заголовка длины содержимого отправляется надлежащим образом.

Ниже приведены захваченные заголовки из wirehark.


PUT /test/DC70439C-5004-11E6-B4B2-91D87435845D HTTP/1.1
Host: mytest.blob.core.windows.net
Accept: */*
Transfer-Encoding: chunked
x-ms-blob-type:BlockBlob
x-ms-version:2015-02-21
Content-Length:0
x-ms-date:Fri, 22 Jul 2016 12:07:28 GMT
Authorization:SharedKey   kanchan:HQQ7a47TPQtEhL0ek6rim64ZKC8NRubgKuq+4Os+Aoo=
Expect: 100-continue

Не могли бы вы помочь выяснить, почему значение заголовка длины содержимого было установлено как -1?

Спасибо и привет, Рахул Найк


person Rahul Naik    schedule 22.07.2016    source источник
comment
Ниже приводится строка для подписи, используемая для генерации заголовка авторизации PUT x-ms-blob-type: BlockBlob x-ms-date: Fri, 22 Jul 2016 12:07:28 GMT x-ms-version: 2015-02-21 / test / test / DC70439C-5004-11E6-B4B2-91D87435845D Поскольку мы используем версию 2015-02-21, мы убедились, что в stringToSign не добавлен заголовок длины содержимого, если его длина равна 0.   -  person Rahul Naik    schedule 22.07.2016


Ответы (2)


Я не воспроизводил вашу проблему. Ниже приведен мой протестированный код с использованием cURL для отправки файла в хранилище BLOB-объектов Azure. Это работает на моей стороне, и я могу загрузить файл размером 0 (установить содержимое файла как ""). Надеюсь, это может дать вам несколько советов.

storage_account="<account name>"
container_name="<container name>"
access_key="<account key>"
content="<file content>"
len=${#content}
blobname="<blob name>"
blob_store_url="blob.core.windows.net"
authorization="SharedKey"
request_method="PUT"
request_date=$(TZ=GMT date "+%a, %d %h %Y %H:%M:%S %Z")
storage_service_version="2011-08-18"
# HTTP Request headers
x_ms_date_h="x-ms-date:$request_date"
x_ms_version_h="x-ms-version:$storage_service_version"
# Build the signature string
canonicalized_headers="x-ms-blob-type:BlockBlob\n${x_ms_date_h}\n${x_ms_version_h}"
canonicalized_resource="/${storage_account}/${container_name}/${blobname}"
string_to_sign="${request_method}\n\n\n${len}\n\napplication/x-www-form-urlencoded\n\n\n\n\n\n\n${canonicalized_headers}\n${canonicalized_resource}"
# Decode the Base64 encoded access key, convert to Hex.
decoded_hex_key="$(echo -n $access_key | base64 -d -w0 | xxd -p -c256)"
signature=$(printf "$string_to_sign" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:$decoded_hex_key" -binary |  base64 -w0)
authorization_header="Authorization: $authorization $storage_account:$signature"


curl \
  -X PUT \
  -H "$x_ms_date_h" \
  -H "$x_ms_version_h" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "$authorization_header" \
  -H "x-ms-blob-type:BlockBlob" \
  -d ${content} "https://${storage_account}.${blob_store_url}/${container_name}/${blobname}"
person Jambor - MSFT    schedule 25.07.2016

Кажется, «канчан» не совпадает с «mytest». мы можем найти эту информацию по этой ссылке: https://msdn.microsoft.com/en-us/library/azure/dd179428.aspx.

Authorization:SharedKey   kanchan:HQQ7a47TPQtEhL0ek6rim64ZKC8NRubgKuq+4Os+Aoo=

Из документа мы можем узнать, что «канчан» - это имя учетной записи. Однако информация о хосте «mytest.blob.core.windows.net» показывает «mytest». Может в этом проблема.

person Jambor - MSFT    schedule 23.07.2016
comment
Извините, это моя проблема. Канчан - это имя учетной записи. Перед тем, как опубликовать этот вопрос, я попытался заменить kancahn на mytest, но этот вопрос пропущен. - person Rahul Naik; 24.07.2016