使用BadRequest创建名称中带有转义的&符号的Azure Media Asset v3失败,但通过Azure门户创建时可以正常工作

时间:2019-12-15 08:29:58

标签: azure azure-media-services

试图把我的头缠起来。我有一个媒体文件名,文件名中带有“&”号。如果尝试创建Azure媒体资产,则会收到BadRequest错误,

{
    error: {
        code: 'InvalidDoubleEncodedRequestUri',
        message:
            "The request URI 'https://management.azure.com:443/subscriptions/..../resourceGroups/.../providers/Microsoft.Media/mediaServices/.../assets/M%2526G+1+Width.mp4?api-version=2018-07-01' is not valid, because it contains double encoding sequence '%25'.",
    },
}

我试图转义文件名中的'&',但仍然出现错误。我不知道的是,如果我通过Azure Media Service门户上载相同的文件,则可以正常工作。我不是在做什么门户网站?

更新

如果我不转义资产名称,则会收到一个400错误的请求,而不是返回(经典的.net黄屏死机)。据我所知,这意味着名称包含无效字符。删除“&”后,它就会起作用。

从我读过的here来看,它提到您不能在资产名称中使用以下字符(“ <”,“>”,“%”,“&”,“:” ,“ \”,“?”,“ /”,“ *”,“ +”,“。”,单引号字符或任何控制字符)。但这使我感到困惑。容器名称是自动生成的(资产-...一些GUID ...),然后它只是容器中的Blob(文件名中允许使用'&'字符。我只是不明白为什么,如果我是通过门户网站上传的,则可以,但是通过SDK失败。

1 个答案:

答案 0 :(得分:0)

Azure Portal使用v2 API,该API不遵循Azure资源管理的命名约束。

在V3 API中,资产是一个命名的ARM实体,因此遵循此处定义的所有其他Azure资源的命名规则:Naming Conventions in v3

使用v3 API时,您应遵循Azure ARM实体的命名准则。如果需要存储备用身份信息,则可以使用资产上的自定义“ AlternateId”属性。或者,您可以根据需要使用description属性。

curl -X PUT \
  'https://management.azure.com/subscriptions/XXXXXXX/resourceGroups/XXXXX/providers/Microsoft.Media/mediaServices/XXXXX/assets/myAsset?api-version=2018-07-01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer 
  -H 'Connection: keep-alive' \
  -H 'Content-Length: 303' \
  -H 'Content-Type: application/json' \
  -H 'Host: management.azure.com' \
  -d '{
  "properties": {
    "description": "some custom description with whatever you need to store",
    "alternateId": "(Optional) some custom string to help you look it up in your database"
  }
}'