Создание веб-сервиса
Создание веб-службы
Выбор правильной веб-роли
Выбор веб-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)
{
}
}








