我正在使用c#为新资源创建共享访问签名(用户应具有创建权限以在我的存储帐户上创建新资源)。 MS文档已经过时了,我似乎无法使用我经历的不同博客文章来使用它。
现在我的代码看起来像这样:
public static string GetBlobSharedAccessSignitureUrl(CloudBlobContainer container,string nameOfBlobToCreateSaSfor)
{
var blob = container.GetBlockBlobReference(nameOfBlobToCreateSaSfor);
var policy = new SharedAccessBlobPolicy
{
SharedAccessExpiryTime = DateTime.Now.AddHours(1),
Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read
};
container.GetSharedAccessSignature(policy);
string sas = blob.GetSharedAccessSignature(policy);
return blob.Uri.AbsoluteUri + sas;
}
并且返回的url(对于我的本地机器)看起来像这样(似乎是正确的)
http://127.0.0.1:10000/devstoreaccount1/photos/photos_4.jpg?sv=2012-02-12&se=2013-01-20T10%3A13%3A17Z&sr=b&sp=rw&sig=xxx
我启动了Azure存储模拟器并通过fiddler尝试POST到此URL(也尝试过PUT)
我收到错误(404或400,取决于我尝试过的此功能的不同代码)
我还需要做点什么吗? (在旧的例子中,我看到他们在那之前在那个位置创建了一个资源 - 我也尝试了但是也没有工作......)
Azure SDK版本为2.0,因此2012年10月之前的MS博客帖子(以及其他教程)已被破坏(同样根据MS开发博客http://blogs.msdn.com/b/windowsazurestorage/archive/2012/10/29/windows-azure-storage-client-library-2-0-breaking-changes-amp-migration-guide.aspx)
任何帮助将不胜感激
答案 0 :(得分:1)
如果您通过Fiddler或通过代码发布,请确保添加“x-ms-blob-type”请求标头并将其值设置为“BlockBlob”。看看它尝试上传文件的示例代码:
FileInfo fInfo = new FileInfo(fileName);//fileName is the full path of the file.
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(blobSaSUrl);
NameValueCollection requestHeaders = new NameValueCollection();
requestHeaders.Add("x-ms-blob-type", "BlockBlob");
req.Method = "PUT";
req.Headers.Add(requestHeaders);
req.ContentLength = fInfo.Length;
byte[] fileContents = new byte[fInfo.Length];
using (FileStream fs = fInfo.OpenRead())
{
fs.Read(fileContents, 0, fileContents.Length);
using (Stream s = req.GetRequestStream())
{
s.Write(fileContents, 0, fileContents.Length);
}
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
}
}
答案 1 :(得分:0)
创建一个有效期为一小时的SAS令牌。
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
BlobContainerName = containerName,
BlobName = blobName,
Resource = "b",
StartsOn = DateTimeOffset.UtcNow,
ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
};
指定SAS的读取权限。
sasBuilder.SetPermissions(BlobSasPermissions.Read);
使用密钥获取SAS令牌。
string sasToken = sasBuilder.ToSasQueryParameters(key, accountName).ToString();
构造完整的URI,包括SAS令牌。
UriBuilder fullUri = new UriBuilder()
{
Scheme = "https",
Host = string.Format("{0}.blob.core.windows.net", accountName),
Path = string.Format("{0}/{1}", containerName, blobName),
Query = sasToken
};