从SAS URL上传到azure blob存储将返回404状态

我正在使用Azure移动服务API端点将私有共享访问签名URL返回到我的Azure存储容器,如下所示:

var blobService = azure.createBlobService(accountName, key, host); blobService.createContainerIfNotExists(containerName, function(err) { if (err) { cb(err, null); return; } // Generate a 5 minute access var expiryDate = minutesFromNow(5); var sharedAccessPolicy = { AccessPolicy: { Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.WRITE, Expiry: expiryDate } }; // Generate the URL with read access token var sasURL = blobService.generateSharedAccessSignature(containerName, blobName, sharedAccessPolicy); var urlForDownloading = sasURL.baseUrl + sasURL.path + '?' + qs.stringify(sasURL.queryString); cb(null, urlForDownloading); }); function minutesFromNow(minutes) { var date = new Date(); date.setMinutes(date.getMinutes() + minutes); return date; }; 

然后,我将这个URL返回给我的iOS客户端上传文件并将其处理为:

 client.invokeAPI("document/\(document.idValue).\(document.fileExtension)", body: nil, HTTPMethod: "PUT", parameters: nil, headers: nil) { result, response, error in if let dictResult = result as? NSDictionary { // Get the SAS URL to write directly to the blob storage if let location = dictResult["location"] as? String { let url = NSURL(string: location) let request = NSURLRequest(URL: url) let uploadTask = session.uploadTaskWithRequest(request, fromFile: localFile) { data, response, error in if completionBlock != nil { let success = (error == nil && httpResponse.statusCode == 200) completionBlock!(success) } } } } } uploadTask.resume() 

iOS客户端收到一条404响应消息

 <?xml version="1.0" encoding="utf-8"?><Error><Code>ResourceNotFound</Code><Message>The specified resource does not exist. 

该容器确实存在于存储帐户中,并请求从容器中获取blob,访问密钥是成功的。 这个新的blob不会存在,因为它是一个新的上传,但为什么我得到一个404写入请求的容器?

find解决scheme…

let request = NSURLRequest(URL: url)产生一个GET请求,甚至把它传递给uploadTaskWithRequest持续这种请求types,而我认为这个调用会改变它的PUT或POST请求表示上传。

将iOS请求定义为

 let request = NSMutableURLRequest(URL: url) request.HTTPMethod = "PUT" 

那是成功的。 返回的响应是201创build的。