Создание веб-сервиса
Создание веб-службы
Выбор правильной веб-роли
Выбор веб-API
Различные файлы будут сгенерированы Visual Studio. Это может быть ошеломляющим, но нам нужно беспокоиться только о паре файлов.
RouteConfig.cs
Рисунок 10: MainWindow.xaml.cs
ValuesController.cs
ValuesController.cs
ValuesController.cs
- Мы готовы обратить наше внимание на веб-сервис , который позволит загружать фото в облако
- Нам нужно будет вернуться к проекту Windows 8 позже , когда мы завершим облачный проект, который предоставит подпись общего доступа .
- Как вы помните, подпись общего доступа необходима для того, чтобы приложение Windows 8 могло загрузить фотографию непосредственно в облако .
- Это обходит необходимость проходить через веб-сайт (веб-роль).
- Мы можем сэкономить деньги и получить масштаб.
- Мы начнем с проекта на стороне сервера / веб — служб .
- Мы будем использовать веб-API ASP.NET , встроенный в Visual Studio 2012.
- Web API является основой для создания и потребления HTTP услуг , которые могут достигать широкий круг клиентов , включая браузеры, телефоны и планшеты .
- Обычно вы можете выбрать один из этих двух типов проектов : (1) Windows Communication Foundation (WCF); или (2) ASP.NET Web API, который входит в MVC версии 4.
- Мы возьмем новые, более современные концепции, которые ASP.NET Web API привносит в таблицу, по-настоящему охватывая концепции HTTP (URI и глаголы).
- Кроме того, веб-API ASP.NET можно использовать для создания служб, которые с большей легкостью используют более продвинутые функции HTTP, такие как заголовки запросов / ответов, конструкции гипермедиа.
Создание веб-службы
- Давайте начнем с запуска Visual Studio 2012 в качестве администратора . Вот шаги для создания серверной веб-службы с использованием веб-API ASP.NET MVC 4:
- Нажмите на меню Файл и выберите New / Project.
- Убедитесь, что выбранная структура . NET Framework 4
- Выберите Облако из установленных шаблонов
- Выберите облачную службу Windows Azure
- Введите имя из WebService и Место вашего выбора.
- Нажмите ОК .
Выбор правильной веб-роли
- Выберите веб-роль ASP.NET MVC 4
- Нажмите кнопку > , чтобы переместить веб-роль ASP.NET MVC 4 на правую панель.
- Нажмите ОК
Выбор веб-API
- Выберите веб-API для шаблона проекта
- Нажмите ОК
Различные файлы будут сгенерированы Visual Studio. Это может быть ошеломляющим, но нам нужно беспокоиться только о паре файлов.
- RouteConfig.cs используется для сопоставления URL-адресов.
- Часть URL маршрута — это просто механизм сопоставления для запроса.
- Если URL соответствует определенному маршруту , платформа связывает запрос с конкретным контроллером и методом действия для обработки запроса .
- Короче говоря, механизм маршрутизации сопоставляет входящие URL-адреса с приложением, поэтому для их обработки выполняется правильный метод Controller и Action.
- ValuesController.cs — это место, где мы определяем методы действия, которые будут обрабатывать запрос , что выражается URL-адресом и глаголом, используемыми в веб-запросе.
- VisualController.cs является важным файлом, поскольку он содержит код, который будет выполняться, когда клиент Windows 8 отправляет HTTP-запрос к веб-службе.
- Здесь мы добавим часть нашего кода для возврата данных JSON, необходимых для приложения Windows 8 .
- Класс ValuesController создается Visual Studio и наследуется от ApiController , который возвращает данные, которые сериализуются и отправляются клиенту .
RouteConfig.cs
- Ваш файл 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
- Еще раз, VisualController.cs является важным файлом, поскольку он содержит код, который будет выполняться, когда клиент Windows 8 отправляет HTTP-запрос к веб-службе.
- Здесь мы добавим часть нашего кода для возврата подписи общего доступа, требуемой приложением Windows 8.
- Класс ValuesController создается Visual Studio и наследуется от ApiController, который возвращает данные, которые сериализуются и отправляются клиенту, автоматически в формате JSON.
- Мы вернем подпись общего доступа в формате JSON.
- Обратите внимание, что описанные выше методы — Get (), Post (), Put (), Delete () — сопоставляются с конкретными операциями CRUD и глаголами HTTP, выполняемыми приложением Windows 8.
- В этом прелесть ASP.NET Web API Framework: он автоматически направляет используемые HTTP-глаголы клиентом напрямую к методам, определенным в классе VisualController, сводя к минимуму возможные ошибки программирования.
- Как вы помните из предыдущего раздела, мы изменили структуры маршрутизации для поддержки передачи параметров.
- Это означает, что нам нужно добавить третий метод 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) { } }
- Обратите внимание, что на рисунке выше мы добавим дополнительный метод для поддержки передачи двух параметров из приложения Windows 8 .
- Этот метод будет вызван, когда клиент выполнит следующий веб-запрос:
- http://127.0.0.1:81/api/values?container=photocontainer&blobname=photo1.jpg
- Этот метод будет вызван, когда клиент выполнит следующий веб-запрос:
- Вы можете видеть, что параметры встроены непосредственно в URL .
- Платформа Web API будет анализировать параметры и сопоставлять их с параметрами, указанными выше (container, blobname)
- В верхней части файла ValuesController.cs вам необходимо добавить 2 оператора using, как показано ниже:
- Операторы using необходимы, потому что код, который мы собираемся добавить, использует сборки в Azure SDK.
ValuesController.cs
using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient;
Финальный класс представлен ниже.
- Некоторые заслуживающие внимания моменты включают в себя:
- Требуется учетная запись хранения. Мы получаем это, зарегистрировав бесплатную 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) { } }