2016-06-09 2 views
1

Я новичок в разработке Xamarin. Я использую ведро Azure для загрузки файлов в мобильное приложение Android. Для целей тестирования я создал консольное приложение, которое успешно загружает файл на лазурное ведро без прерывания. Но когда я пытаюсь создать токен доступа из мобильной разработки, он застревает и дает мне исключение тайм-аута. Если я создаю токен из консольного приложения и использую этот токен для загрузки файлов, он дает мне другое исключение, например «владелец места не найден». Как и ожидалось, мне нужна мобильная услуга для генерации токенов. Если у вас есть какие-либо идеи, поделитесь своими мнениями со мной, что было бы очень полезно. Я также загружаю код, который я использую для разработки Android.Синхронизация файла Azure в Xamarin

[Activity(Label = "WedAndroidApp", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity : Activity 
{ 
    int count = 1; 
    //string sas = "https://supplypark.blob.core.windows.net/transaction-images?sv=2015-04-05&sr=c&sig=iJ8CZOi%2BktarlmrbZVHK7rYLdMOnKCeBjuPqjrrkGnM%3D&se=2016-06-09T14%3A21%3A49Z&sp=rwdl"; 
    string sas_token = "https://supplypark.blob.core.windows.net/transaction-images?sv=2015-04-05&sr=c&sig=AeWe8rghAlKz77Xh%2BUM6S46AuUQzAaD2djqhaW9wdN8%3D&se=2016-06-09T14%3A21%3A49Z&sp=rwdl"; 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 

     // Get our button from the layout resource, 
     // and attach an event to it 
     Button button = FindViewById<Button>(Resource.Id.MyButton); 

     //button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); }; 
     button.Click += async delegate { 
      button.Text = string.Format("{0} clicks!", count++); 
      await UseContainerSAS(sas_token); 
     }; 
    } 

    static async Task UseContainerSAS(string sas) 
    { 
     //Try performing container operations with the SAS provided. 

     //Return a reference to the container using the SAS URI. 
     CloudBlobContainer container = new CloudBlobContainer(new Uri(sas)); 
     string date = DateTime.Now.ToString(); 
     try 
     { 
      //Write operation: write a new blob to the container. 
      CloudBlockBlob blob = container.GetBlockBlobReference("tdi" + date + ".txt"); 

      string blobContent = "This blob was created with a shared access signature granting write permissions to the container. "; 
      MemoryStream msWrite = new 
      MemoryStream(Encoding.UTF8.GetBytes(blobContent)); 
      msWrite.Position = 0; 
      using (msWrite) 
      { 
       await blob.UploadFromStreamAsync(msWrite); 
      } 
      Console.WriteLine("Write operation succeeded for SAS " + sas); 
      Console.WriteLine(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Write operation failed for SAS " + sas); 
      Console.WriteLine("Additional error information: " + e.Message); 
      Console.WriteLine(); 
     } 

    } 
} 
+0

Я следую за этим https://azure.microsoft.com/en-in/documentation/articles/storage-xamarin-blob-storage/ для разработки azure mobile. Но зависимости Azure от хранилища не загружаются из пакета neget. –

+0

Привет, ребята, я решил проблему. Если у вас возникли проблемы с установкой зависимостей, используйте менеджер пакетов Console для установки зависимостей. Пожалуйста, следуйте приведенным ниже: - «Install-Package WindowsAzure.Storage -Version 4.4.1-preview -Pre» –

ответ

0

Если вы уже используете Azure Mobile Apps, я бы рекомендовал использовать встроенную функцию, которая получает доступ к Azure Storage: Connect to Azure Storage in your Xamarin.Forms app

В противном случае, вы должны написать код, который создает SAS маркер на ваш сервер, а не ваш клиент. Главный ключ хранения должен быть никогда не быть распространенным с вашим клиентским приложением, так как это будет большой риск для безопасности. У вас должен быть ключ только на вашем сервере, и он должен отправить токен SAS клиентам для доступа к конкретному блобу или контейнеру.

Если вы используете мобильное приложение/мобильную службу .NET backend, то вам следует просто переместить код SAS на пользовательский API на сервере. Если вы используете Node.js, вы можете следовать этому руководству: Work with shared access signatures in Node.js.

Если у вас нет бэкэнда для мобильного приложения, вы можете использовать Azure Functions для генерации маркеров SAS. Вот пример: https://github.com/lindydonna/GetSasToken-function.

Обратите внимание, что Azure Mobile Service устарела, поэтому вместо этого вы должны использовать Azure Mobile Apps.

+0

Спасибо, Я также думал о перемещении кода генерации SAS на сервере. из-за риска безопасности. Но я создал токен SAS и передал его как параметр функции UseContainerSAS (string sas), но он застревает при загрузке файла. Должен ли я также перемещать логику загрузки файлов на сервер? –

+0

Нет, логика загрузки файлов все равно должна быть на клиенте. Я бы прошел через него в отладчике, чтобы посмотреть, что происходит. Вы можете начать с консольного приложения, чтобы упростить его отладку. Кроме того, если мой ответ был полезным, пожалуйста, примите его. :) –

+0

Я пробовал то же самое в приложении консоли, он работает. Я использовал тот же код. Может возникнуть проблема с зависимостями Nuget, которые я использую для загрузки файлов в разработку Android. –

Смежные вопросы