Статьи

Возьмите фотографии из приложений Windows 8 / Автоматическая загрузка их в облако — Pt. 3/6

Создание веб-сервиса

001

  1. Мы готовы обратить наше внимание на веб-сервис , который позволит загружать фото в облако
  2. Нам нужно будет вернуться к проекту Windows 8 позже , когда мы завершим облачный проект, который предоставит подпись общего доступа .
  3. Как вы помните, подпись общего доступа необходима для того, чтобы приложение Windows 8 могло загрузить фотографию непосредственно в облако .

    1. Это обходит необходимость проходить через веб-сайт (веб-роль).
    2. Мы можем сэкономить деньги и получить масштаб.
  4. Мы начнем с проекта на стороне сервера / веб — служб .
  5. Мы будем использовать веб-API ASP.NET , встроенный в Visual Studio 2012.
  6. Web API является основой для создания и потребления HTTP услуг , которые могут достигать широкий круг клиентов , включая браузеры, телефоны и планшеты .

    • Обычно вы можете выбрать один из этих двух типов проектов : (1) Windows Communication Foundation (WCF); или (2) ASP.NET Web API, который входит в MVC версии 4.
    • Мы возьмем новые, более современные концепции, которые ASP.NET Web API привносит в таблицу, по-настоящему охватывая концепции HTTP (URI и глаголы).
  7. Кроме того, веб-API ASP.NET можно использовать для создания служб, которые с большей легкостью используют более продвинутые функции HTTP,   такие как заголовки запросов / ответов, конструкции гипермедиа.

Создание веб-службы

002

  1. Давайте начнем с запуска Visual Studio 2012 в качестве администратора . Вот шаги для создания серверной веб-службы с использованием веб-API ASP.NET MVC 4:

    • Нажмите на меню Файл и выберите New / Project.
    • Убедитесь, что выбранная структура . NET Framework 4
    • Выберите Облако из установленных шаблонов
    • Выберите облачную службу Windows Azure
    • Введите имя из WebService и Место вашего выбора.
    • Нажмите ОК .

Выбор правильной веб-роли

003

  1. Выберите веб-роль ASP.NET MVC 4
  2. Нажмите кнопку > , чтобы переместить веб-роль ASP.NET MVC 4 на правую панель.
  3. Нажмите ОК

Выбор веб-API

004

  1. Выберите веб-API для шаблона проекта
  2. Нажмите ОК

Различные файлы будут сгенерированы Visual Studio. Это может быть ошеломляющим, но нам нужно беспокоиться только о паре файлов.

005

  1. RouteConfig.cs используется для сопоставления URL-адресов.

    • Часть URL маршрута — это просто механизм сопоставления для запроса.
    • Если URL соответствует определенному маршруту , платформа связывает запрос с конкретным контроллером и методом действия для обработки запроса .
    • Короче говоря, механизм маршрутизации сопоставляет входящие URL-адреса с приложением, поэтому для их обработки выполняется правильный метод Controller и Action.
  2. ValuesController.cs — это место, где мы определяем методы действия, которые будут обрабатывать запрос , что выражается URL-адресом и глаголом, используемыми в веб-запросе.

    • VisualController.cs является важным файлом, поскольку он содержит код, который будет выполняться, когда клиент Windows 8 отправляет HTTP-запрос к веб-службе.
    • Здесь мы добавим часть нашего кода для возврата данных JSON, необходимых для приложения Windows 8 .
    • Класс ValuesController создается Visual Studio и наследуется от ApiController , который возвращает данные, которые сериализуются и отправляются клиенту .

RouteConfig.cs

006

  1. Ваш файл RouteConfig.cs должен выглядеть следующим образом.

    • Обратите внимание, что добавляется следующий маршрут:

      • апи / {контроллер} / {контейнер} / {blobname}

 


Рисунок 10: MainWindow.xaml.cs

 

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        // Add a route to support the passing of a container name
        // and the blob name, which is the picture uploaded from the
        // Windows 8 application. The URL below (issued by a Windows 8 Application)
        // resolves to call an action method in ValuesController.cs
        routes.MapHttpRoute(
            name: "DefaultApi2",
            routeTemplate: "api/{controller}/{container}/{blobname}"
        );
 
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Модификация ValuesController.cs
007

  1. Еще раз, VisualController.cs является важным файлом, поскольку он содержит код, который будет выполняться, когда клиент Windows 8 отправляет HTTP-запрос к веб-службе.
  2. Здесь мы добавим часть нашего кода для возврата подписи общего доступа, требуемой приложением Windows 8.
  3. Класс ValuesController создается Visual Studio и наследуется от ApiController, который возвращает данные, которые сериализуются и отправляются клиенту, автоматически в формате JSON.

    • Мы вернем подпись общего доступа в формате JSON.
  4. Обратите внимание, что описанные выше методы — Get (), Post (), Put (), Delete () — сопоставляются с конкретными операциями CRUD и глаголами HTTP, выполняемыми приложением Windows 8.
  5. В этом прелесть ASP.NET Web API Framework: он автоматически направляет используемые HTTP-глаголы клиентом напрямую к методам, определенным в классе VisualController, сводя к минимуму возможные ошибки программирования.
  6. Как вы помните из предыдущего раздела, мы изменили структуры маршрутизации для поддержки передачи параметров.
  7. Это означает, что нам нужно добавить третий метод Get () в ValuesController.cs.

ValuesController.cs

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
  
    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }
  
    // POST api/values
    public void Post(string value)
    {
    }
  
    // PUT api/values/5
    public void Put(int id, string value)
    {
    }
  
    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}

Добавление нового метода
008

  1. Обратите внимание, что на рисунке выше мы добавим дополнительный метод для поддержки передачи двух параметров из приложения Windows 8 .

    • Этот метод будет вызван, когда клиент выполнит следующий веб-запрос:

      • http://127.0.0.1:81/api/values?container=photocontainer&blobname=photo1.jpg
  2. Вы можете видеть, что параметры встроены непосредственно в URL .
  3. Платформа Web API будет анализировать параметры и сопоставлять их с параметрами, указанными выше (container, blobname)
  4. В верхней части файла ValuesController.cs вам необходимо добавить 2 оператора using, как показано ниже:

    • Операторы using необходимы, потому что код, который мы собираемся добавить, использует сборки в Azure SDK.

ValuesController.cs

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;

 Финальный класс представлен ниже.
009

  1. Некоторые заслуживающие внимания моменты включают в себя:

    • Требуется учетная запись хранения. Мы получаем это, зарегистрировав бесплатную 90-дневную учетную запись в Azure. Смотрите конец этого поста.
    • Мы можем использовать встроенный эмулятор хранилища, который позволяет нам эмулировать облачное хранилище в нашей локальной системе.

      • Но я хочу показать вам, как развернуть в реальном центре обработки данных
    • В следующем посте мы внесем некоторые тривиальные изменения и развернем веб-службу в Microsoft Data Center.
    • Капли хранятся в контейнерах.
      • Они не одиноки.
    • Приложение Windows 8 передает имя контейнера в дополнение к имени фотографии .
    • Контейнер предназначен быть публичным, что позволяет любому приложению с фотографией URL , чтобы загрузить его.
    • Суть нашего метода Get (), чтобы вернуть Подпись Shared Access.
    • Создание подписи общего доступа требует от вас указать уровень разрешений и срок действия.
    • Вы можете думать о подписи общего доступа как о проходном в старшей школе, который позволяет вам ходить по коридорам в течение определенного периода времени.

      • По истечении срока действия вашего прохода в зал вы теряете право ходить по коридору.
      • Когда SAS истекает, вы больше не можете добавлять / изменять BLOB-объекты (фотографии)
    • В конечном счете, метод Get () возвращает подпись общего доступа в приложение Windows 8 .

      • Подпись общего доступа дает приложению Windows 8 4 часа для записи фотографий в указанный контейнер.

ValuesController.cs

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
    // GET api/values/container/blobname
    public string Get(string container, string blobname)
    {
        try
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("DataConnectionString"));
 
            //CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
 
            // Client object provides a client for accessing the Windows Azure Blob service.
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
 
            // All blobs are written into a container
            CloudBlobContainer blobContainer = blobClient.GetContainerReference(container);
 
            // Create container if does not exist.
            blobContainer.CreateIfNotExist();
 
            // Mark the container of the image as public so that can be read by anyone.
            BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
            containerPermissions.PublicAccess = BlobContainerPublicAccessType.Blob;
 
            // Define a 4 hour window that the Windows 8 client can write to Azure Blob Storage.
            containerPermissions.SharedAccessPolicies.Add("mypolicy", new SharedAccessPolicy()
            {
                Permissions = SharedAccessPermissions.Write, // | SharedAccessPermissions.Read ,
                //To be available immediately don't set SharedAccessStartTime =
                SharedAccessExpiryTime = DateTime.Now.Add(TimeSpan.FromHours(4))
            });
 
            // Set the permissions so that Windows 8 client can write to the container
            // for the 4 hours specified above.
            blobContainer.SetPermissions(containerPermissions);
 
            // Create the shared access signature that will be added to the URL.
            string sas = blobContainer.GetSharedAccessSignature(new SharedAccessPolicy(), "mypolicy");
 
            // Creat the URI to be return to the Windows 8 client that will be used to write
            // to blob storage.
            return string.Format("{0}/{1}{2}", blobContainer.Uri, blobname, sas);
 
        }
        catch (Exception ex)
        {
            // Return error message to client.
            string error = ex.Message;
            return error;
        }
 
    }
    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }
 
    // POST api/values
    public void Post(string value)
    {
    }
 
    // PUT api/values/5
    public void Put(int id, string value)
    {
    }
 
    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}