3

尝试使用以下代码上传文件时出现以下异常:

            string encodedUrl = "videos/Sample.mp4"
            CloudBlockBlob encodedVideoBlob = blobClient.GetBlockBlobReference(encodedUrl);
            Log(string.Format("Got blob reference for {0}", encodedUrl), EventLogEntryType.Information);
            encodedVideoBlob.Properties.ContentType = contentType;
            encodedVideoBlob.Metadata[BlobProperty.Description] = description;
            encodedVideoBlob.UploadFile(localEncodedBlobPath);

我看到“得到 blob 引用”消息,所以我认为引用正确解析。

Void Run() C:\Inter\Projects\PoC\WorkerRole\WorkerRole.cs (40)
System.ArgumentNullException: Value cannot be null.
Parameter name: value
   at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result()
   at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait()
   at Microsoft.WindowsAzure.StorageClient.CloudBlob.UploadFromStream(Stream source, BlobRequestOptions options)
   at Microsoft.WindowsAzure.StorageClient.CloudBlob.UploadFile(String fileName, BlobRequestOptions options)
   at EncoderWorkerRole.WorkerRole.ProcessJobOutput(IJob job, String videoBlobToEncodeUrl) in C:\Inter\Projects\PoC\WorkerRole\WorkerRole.cs:line 144
   at EncoderWorkerRole.WorkerRole.Run() in C:\Inter\Projects\PoC\WorkerRole\WorkerRole.cs:line 40

有趣的是,我正在从本地服务器(即在 Azure 之外)运行相同的代码段,并且它可以正常工作。

欢迎提出想法,谢谢!

4

1 回答 1

8

找到罪魁祸首!

基本上,问题出在这一行

编码的VideoBlob.Metadata[BlobProperty.Description] = 描述;

有一个检查可以确保没有设置空元数据或空元数据。通过从 Reflector 反汇编并搜索 ArgumentNullException 出现找到它。

在堆栈中捕获并重新抛出更有意义的异常可能会很棒:-)

以下是有趣的方法:

internal static void AddMetadata(HttpWebRequest request, NameValueCollection metadata)
{
    if (metadata != null)
    {
        foreach (string str in metadata.AllKeys)
        {
            AddMetadata(request, str, metadata[str]);
        }
    }
}

internal static void AddMetadata(HttpWebRequest request, string name, string value)
{
    CommonUtils.AssertNotNullOrEmpty("value", value);
    request.Headers.Add("x-ms-meta-" + name, value);
}


internal static void AssertNotNullOrEmpty(string paramName, string value)
{
    AssertNotNull(paramName, value);
    if (string.IsNullOrEmpty(value))
    {
        throw new ArgumentException(Microsoft.WindowsAzure.SR.ArgumentEmptyError, paramName);
    }
}

internal static void AssertNotNull(string paramName, object value)
{
    if (value == null)
    {
        throw new ArgumentNullException(paramName);
    }
}
于 2012-10-22T22:56:44.770 回答