Xamarin的Azure文件共享REST API [英] Azure File Share REST API for Xamarin

查看:130
本文介绍了Xamarin的Azure文件共享REST API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Xamarin客户端应用中,我要访问 Azure文件SAS令牌与Portable Class Library一起使用.看来我无法使用最新的 WindowAzure.Storage nuget包来做到这一点,因为它可能只有可与Blob,Table等一起使用,并且需要很多依赖项.

In Xamarin client app, I want to access Azure Files using SAS token with Portable Class Library. It seems I can not do it using latest WindowAzure.Storage nuget package as it may only works with Blob, Table,... and it requires lots of dependencies.

反正有什么要完成的吗?

Is there anyway to accomplish this?

推荐答案

我最终使用了 Azure文件存储REST API . 基本上,我们首先请求从Azure共享生成的SAS令牌,然后在URL中使用该SAS令牌将http请求发送到Azure文件存储:

I ended up with using Azure File Storage REST API. Basically we request SAS token generated from Azure Share first then using that SAS token in URL to send http request to Azure Files Storage:

https://[yourshare]. file.core.windows.net/[您的目录]/[您的文件]?[your_sas_token]

我创建了一个类来帮助客户端执行以下一些基本操作(它是可移植类,因此可以在客户端的任何地方使用):

I have created a class to help client doing some basic operations as below (it is portable class so can use anywhere in client side):

public class AzureFileREST
    {
        private AzureSASToken _azureShareToken;

        public AzureFileREST(AzureSASToken azureShareToken)
        {
            _azureShareToken = azureShareToken;
        }

        public async Task CreateIfNotExist(string directoryName)
        {
            var existed = await CheckDirectoryExists(directoryName);
            if (!existed)
            {
                await CreateDirectory(directoryName);
            }
        }

        public async Task<bool> CheckDirectoryExists(string directoryName)
        {
            using (var client = new HttpClient())
            {
                //Get directory (https://msdn.microsoft.com/en-us/library/azure/dn194272.aspx)
                var azureCreateDirUrl = _azureShareToken.Url + directoryName + _azureShareToken.SASToken + "&restype=directory";
                var response = await client.GetAsync(azureCreateDirUrl).ConfigureAwait(false);
                return (response.StatusCode != System.Net.HttpStatusCode.NotFound);
            }
        }

        public async Task CreateDirectory(string directoryName)
        {   
            using (var client = new HttpClient())
            {
                //Create directory (https://msdn.microsoft.com/en-us/library/azure/dn166993.aspx)
                var azureCreateDirUrl = _azureShareToken.Url + directoryName + _azureShareToken.SASToken + "&restype=directory";
                var response = await client.PutAsync(azureCreateDirUrl, null).ConfigureAwait(false);
                response.EnsureSuccessStatusCode();
            }
        }

        public async Task UploadFile(string fileName, byte[] fileBytes)
        {
            using (var client = new HttpClient())
            {
                //Create empty file first (https://msdn.microsoft.com/en-us/library/azure/dn194271.aspx)
                var azureCreateFileUrl = _azureShareToken.Url + fileName + _azureShareToken.SASToken;
                client.DefaultRequestHeaders.Add("x-ms-type", "file");
                client.DefaultRequestHeaders.Add("x-ms-content-length", fileBytes.Length.ToString());
                var response = await client.PutAsync(azureCreateFileUrl, null).ConfigureAwait(false);
                response.EnsureSuccessStatusCode();

                //Then upload file (https://msdn.microsoft.com/en-us/library/azure/dn194276.aspx)                
                var azureUploadFileUrl = azureCreateFileUrl + "&comp=range";
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Add("x-ms-write", "update");
                client.DefaultRequestHeaders.Add("x-ms-range", String.Format("bytes=0-{0}", (fileBytes.Length - 1).ToString()));

                var byteArrayContent = new ByteArrayContent(fileBytes);
                response = await client.PutAsync(azureUploadFileUrl, byteArrayContent).ConfigureAwait(false);
                response.EnsureSuccessStatusCode();
            }
        }
    }

在服务器端,使用以下函数从Share生成SAS令牌:

In server side, use the following function to generate SAS token from Share:

public AzureSASToken GetSASFromShare(string shareName)
        {
            var share = _fileclient.GetShareReference(shareName);
            share.CreateIfNotExists();
            string policyName = "UPARSharePolicy";

            // Create a new shared access policy and define its constraints.
            var sharedPolicy = new SharedAccessFilePolicy()
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddDays(15),
                Permissions = SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Write
            };

            // Get existing permissions for the share.
            var permissions = share.GetPermissions();

            // Add the shared access policy to the share's policies. 
            // Note that each policy must have a unique name.
            // Maximum 5 policies for each share!
            if (!permissions.SharedAccessPolicies.Keys.Contains(policyName))
            {
                if (permissions.SharedAccessPolicies.Count > 4)
                {
                    var lastAddedPolicyName = permissions.SharedAccessPolicies.Keys.Last();
                    permissions.SharedAccessPolicies.Remove(lastAddedPolicyName);
                }
                permissions.SharedAccessPolicies.Add(policyName, sharedPolicy);
                share.SetPermissions(permissions);
            }            

            var sasToken = share.GetSharedAccessSignature(sharedPolicy);
            //fileSasUri = new Uri(share.StorageUri.PrimaryUri.ToString() + sasToken);
            return new AzureSASToken ()
            {
               Name = shareName,
               Url = share.StorageUri.PrimaryUri.ToString() + "/",
               SASToken = sasToken        
            };
        }

最后使用这样的类:

var azureFileRest = new AzureFileREST(sasToken);
await azureFileRest.CreateIfNotExist(directoryName);
await azureFileRest.UploadFile(directoryName + "/" + fileName, bytes);

这篇关于Xamarin的Azure文件共享REST API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆