В последнем посте о Windows Azure Media Service (Media Service) я рассказал о том, как вы можете управлять активами с помощью REST API. Вы можете прочитать этот пост здесь: http://gauravmantri.com/2012/10/10/windows-azure-media-service-part-iii-managing-assets-via-rest-api/ .
В этой статье я расскажу о том, как управлять политиками доступа с помощью REST API. В этом посте широко используются концепции, описанные в предыдущих постах, поэтому я бы рекомендовал вам сначала ознакомиться с ними.
Давайте взломать !!!
Определение
Проще говоря, политика доступа определяет разрешения и продолжительность доступа к активу . Для объяснения вы могли бы создать политику доступа, которая предоставляла бы, скажем, разрешение на чтение актива в течение 60 минут .
Из определения может показаться, что вы создаете политику доступа для актива, то есть отношения типа один к одному, однако это не так. Политики доступа и активы имеют общие отношения . Это означает, что вы можете определить политику доступа и применить эту политику доступа к одному или нескольким ресурсам. Точно так же актив может иметь одну или несколько политик доступа. Связь между ними облегчается тем, что называется « локаторами ». Мы расскажем о локаторах в одном из следующих постов, но сейчас давайте просто определим его: локатор — это URI, который обеспечивает доступ к конкретному ресурсу на основе времени.
Сущность политики доступа
Субъект политики доступа определяет абстрактную концепцию политики доступа в медиа — услугах. Вы можете прочитать об атрибутах объекта политики доступа здесь на MSDN: http://msdn.microsoft.com/en-us/library/windowsazure/hh974297.aspx#accesspolicy_properties .
Исходя из этого, мы создадим наш собственный класс. Давайте назовем это AccessPolicy . Вот код для этого:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Net;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace WAMSRestWrapper
{
/// <summary>
/// Class representing an access policy in a media service
/// </summary>
public class AccessPolicy
{
private readonly MediaServiceContext _context;
/// <summary>
/// Creates an instance of <see cref="AccessPolicy"/>
/// </summary>
/// <param name="context">
/// <see cref="MediaServiceContext"/>
/// </param>
internal AccessPolicy(MediaServiceContext context)
{
_context = context;
}
/// <summary>
/// Creates an instance of <see cref="AccessPolicy"/>
/// </summary>
/// <param name="context">
/// <see cref="MediaServiceContext"/>
/// </param>
/// <param name="id">
/// Access policy id
/// </param>
internal AccessPolicy(MediaServiceContext context, string id)
: this(context)
{
Id = id;
}
/// <summary>
/// Creates an instance of <see cref="AccessPolicy"/>
/// </summary>
/// <param name="context">
/// <see cref="MediaServiceContext"/>
/// </param>
/// <param name="name">
/// Access policy friendly name.
/// </param>
/// <param name="durationInMinutes">
/// Timespan for which this access policy will be effective.
/// </param>
/// <param name="permissions">
/// Effective permissions
/// </param>
internal AccessPolicy(MediaServiceContext context, string name, TimeSpan durationInMinutes, AccessPolicyPermission permissions) : this(context)
{
Name = name;
DurationInMinutes = durationInMinutes;
Permissions = permissions;
}
/// <summary>
/// Access policy Id.
/// </summary>
public string Id
{
get;
internal set;
}
/// <summary>
/// Access policy friendly name.
/// </summary>
public string Name
{
get;
internal set;
}
/// <summary>
/// Timespan for which this access policy will be effective.
/// </summary>
public TimeSpan DurationInMinutes
{
get;
internal set;
}
/// <summary>
/// Effective permissions
/// </summary>
public AccessPolicyPermission Permissions
{
get;
internal set;
}
/// <summary>
/// Date/time access policy was created.
/// </summary>
public DateTime Created
{
get;
internal set;
}
/// <summary>
/// Date/time access policy was last modified.
/// </summary>
public DateTime LastModified
{
get;
internal set;
}
}
public enum AccessPolicyPermission
{
None = 0,
Read = 1,
Write = 2,
Delete = 4,
List = 8,
}
}
операции
REST API позволяет выполнять следующие операции над политикой доступа:
- Создайте
- Удалить
- Список
Остальная часть сообщения в блоге будет посвящена этим операциям.
Создайте
Как следует из названия, эта операция создаст новую политику доступа для медиа-службы. Несколько вещей, чтобы рассмотреть здесь:
| Конечная точка | https://wamsbluclus001rest-hs.cloudapp.net/API/AccessPolicies
ИЛИ URI, полученный при проверке перенаправления (см. раздел « Подключение к службе мультимедиа » в записи блога об управлении активами), и добавьте к нему «AccessPolicies». |
| HTTP метод | ПОЧТА |
| Заголовки запроса | DataServiceVersion
MaxDataServiceVersion x-ms-версия Авторизация |
| Запросить тип контента | Применение / JSON; OData = многословным |
| принимать | Применение / JSON; OData = многословным |
| Формат тела запроса | {
«Имя»: «<Имя политики доступа>», «DurationInMinutes»: «100», «Разрешения»: «<Разрешение политики доступа (как целое число)» } например { «Имя»: «Тестировать политику доступа», «DurationInMinutes «:» 100 «, » Разрешения «:» 2 » } |
Вот код для создания политики доступа:
/// <summary>
/// Creates an access policy.
/// </summary>
public void Create()
{
if (string.IsNullOrWhiteSpace(Name))
{
Name = Guid.NewGuid().ToString();
}
string accessPolicyCreateRequestPayloadFormat = @"{0} ""Name"": ""{1}"", ""DurationInMinutes"": ""{2}"", ""Permissions"":""{3}"" {4}";
string requestBody = string.Format(CultureInfo.InvariantCulture, accessPolicyCreateRequestPayloadFormat, "{", Name, DurationInMinutes.TotalMinutes, (int)Permissions, "}");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(CultureInfo.InvariantCulture, "{0}AccessPolicies/", _context.WamsEndpoint));
request.Method = HttpVerbs.Post;
request.ContentType = RequestContentType.Json;
request.Accept = RequestContentType.Json;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, _context.AccessToken));
request.Headers.Add(RequestHeaders.DataServiceVersion, RequestHeaderValues.DataServiceVersion);
request.Headers.Add(RequestHeaders.MaxDataServiceVersion, RequestHeaderValues.MaxDataServiceVersion);
request.ContentLength = Encoding.UTF8.GetByteCount(requestBody);
using (StreamWriter streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(requestBody);
}
using (var response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream(), true))
{
var returnBody = streamReader.ReadToEnd();
JObject responseJsonObject = JObject.Parse(returnBody);
var d = responseJsonObject["d"];
Id = d.Value<string>("Id");
DurationInMinutes = TimeSpan.FromMinutes(d.Value<double>("DurationInMinutes"));
Permissions = (AccessPolicyPermission)d.Value<int>("Permissions");
Name = d.Value<string>("Name");
Created = d.Value<DateTime>("Created");
LastModified = d.Value<DateTime>("LastModified");
}
}
}
и вспомогательный код для вызова этой функции:
var accessPolicy = context.GetAccessPolicyReference("Test", TimeSpan.FromMinutes(10), AccessPolicyPermission.Read | AccessPolicyPermission.Write);
accessPolicy.Create();
Удалить
Опять же, как следует из названия, эта операция удаляет существующую политику. Несколько вещей, чтобы рассмотреть здесь:
| Конечная точка | https://wamsbluclus001rest-hs.cloudapp.net/API/AccessPolicies(‘<access policy id ‘>)
ИЛИ URI, полученный при проверке перенаправления (см. раздел « Подключение к службе мультимедиа » в записи блога об управлении активами ) и добавьте к нему «AccessPolicies (« <идентификатор политики доступа> »)» [Не забудьте заменить <идентификатор политики доступа> фактическим значением идентификатора политики доступа |
| HTTP метод | УДАЛИТЬ |
| Заголовки запроса | DataServiceVersion
MaxDataServiceVersion x-ms-версия Авторизация |
Вот код для удаления политики доступа:
/// <summary>
/// Deletes the access policy.
/// </summary>
public void Delete()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(CultureInfo.InvariantCulture, "{0}AccessPolicies('{1}')", _context.WamsEndpoint, Id));
request.Method = HttpVerbs.Delete;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, _context.AccessToken));
request.Headers.Add(RequestHeaders.DataServiceVersion, RequestHeaderValues.DataServiceVersion);
request.Headers.Add(RequestHeaders.MaxDataServiceVersion, RequestHeaderValues.MaxDataServiceVersion);
var response = (HttpWebResponse)request.GetResponse();
}
и вспомогательный код для вызова этой функции:
var accessPolicyId = "<access policy id>"; var accessPolicy = context.GetAccessPolicyReference(accessPolicyId); accessPolicy.Delete();
Список
Операция со списком позволяет получать информацию о политиках доступа. Используя эту операцию, вы можете
- Получить информацию обо всех политиках доступа для данной медиа-службы
- Получить информацию о конкретной политике доступа в медиа-сервисе
- Получить информацию обо всех политиках доступа, связанных с активом
Как упоминалось выше, связь между политикой доступа и активом устанавливается с помощью локатора, и, поскольку мы еще не рассмотрели локатор, мы не будем рассматривать третий вариант в этом посте.
Получить информацию обо всех политиках доступа для данной медиа-службы
Как видно из заголовка, вы можете получить информацию обо всех политиках доступа для данной медиа-службы. Несколько вещей, чтобы рассмотреть здесь
| Конечная точка | https://wamsbluclus001rest-hs.cloudapp.net/API/AccessPolicies
ИЛИ URI, полученный при проверке перенаправления (см. раздел « Подключение к службе мультимедиа » в записи блога об управлении активами), и добавьте к нему «AccessPolicies». |
| HTTP метод | ПОЛУЧИТЬ |
| Заголовки запроса | DataServiceVersion
MaxDataServiceVersion x-ms-версия Авторизация |
| принимать | Применение / JSON; OData = многословным |
Вот код для получения информации обо всех политиках доступа:
/// <summary>
/// List all access policies in a media service.
/// </summary>
/// <returns>
/// </returns>
public IEnumerable<AccessPolicy> ListAccessPolicies()
{
List<AccessPolicy> accessPolicies = new List<AccessPolicy>();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(CultureInfo.InvariantCulture, "{0}AccessPolicies", WamsEndpoint));
request.Accept = RequestContentType.Json;
request.Method = HttpVerbs.Get;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, AccessToken));
request.Headers.Add(RequestHeaders.DataServiceVersion, RequestHeaderValues.DataServiceVersion);
request.Headers.Add(RequestHeaders.MaxDataServiceVersion, RequestHeaderValues.MaxDataServiceVersion);
using (var response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream(), true))
{
var returnBody = streamReader.ReadToEnd();
JObject responseJsonObject = JObject.Parse(returnBody);
var items = responseJsonObject["d"]["results"];
foreach (var d in items)
{
var Id = d.Value<string>("Id");
var DurationInMinutes = TimeSpan.FromMinutes(d.Value<double>("DurationInMinutes"));
var Permissions = (AccessPolicyPermission)d.Value<int>("Permissions");
var Name = d.Value<string>("Name");
var Created = d.Value<DateTime>("Created");
var LastModified = d.Value<DateTime>("LastModified");
accessPolicies.Add(new AccessPolicy(this, Id)
{
Name = Name,
DurationInMinutes = DurationInMinutes,
Permissions = Permissions,
Created = Created,
LastModified = LastModified,
});
}
}
}
return accessPolicies;
}
и вспомогательный код для вызова этой функции:
var accessPolicies = context.ListAccessPolicies();
Получить информацию о конкретной политике доступа в медиа-сервисе
Вы также можете получить информацию о конкретной политике доступа в медиа-сервисе. Для этого вам нужно знать Id этой политики доступа. Несколько вещей, чтобы рассмотреть здесь:
| Конечная точка | https://wamsbluclus001rest-hs.cloudapp.net/API/AccessPolicies(‘<access policy id ‘>)
ИЛИ URI, полученный при проверке перенаправления (см. раздел « Подключение к службе мультимедиа » в записи блога об управлении активами ) и добавьте к нему «AccessPolicies (« <идентификатор политики доступа> »)» [Не забудьте заменить <идентификатор политики доступа> фактическим значением идентификатора политики доступа |
| HTTP метод | ПОЛУЧИТЬ |
| Заголовки запроса | DataServiceVersion
MaxDataServiceVersion x-ms-версия Авторизация |
| принимать | Применение / JSON; OData = многословным |
Вот код для получения информации обо всех политиках доступа:
/// <summary>
/// Gets information about an access policy.
/// </summary>
public void Get()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(CultureInfo.InvariantCulture, "{0}AccessPolicies('{1}')", _context.WamsEndpoint, Id));
request.Method = HttpVerbs.Get;
request.Accept = RequestContentType.Json;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, _context.AccessToken));
request.Headers.Add(RequestHeaders.DataServiceVersion, RequestHeaderValues.DataServiceVersion);
request.Headers.Add(RequestHeaders.MaxDataServiceVersion, RequestHeaderValues.MaxDataServiceVersion);
using (var response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream(), true))
{
var returnBody = streamReader.ReadToEnd();
JObject responseJsonObject = JObject.Parse(returnBody);
var d = responseJsonObject["d"];
Id = d.Value<string>("Id");
DurationInMinutes = TimeSpan.FromMinutes(d.Value<double>("DurationInMinutes"));
Permissions = (AccessPolicyPermission)d.Value<int>("Permissions");
Name = d.Value<string>("Name");
Created = d.Value<DateTime>("Created");
LastModified = d.Value<DateTime>("LastModified");
}
}
}
и вспомогательный код для вызова этой функции:
var accessPolicyId = "<access policy id>"; var accessPolicy = context.GetAccessPolicyReference(accessPolicyId); accessPolicy.Get();
Получить информацию обо всех политиках доступа, связанных с активом
Вы также можете получить все политики доступа, связанные с активом. Несмотря на то, что я не буду писать здесь код для этого по причинам, которые я упомянул выше, я все же хочу упомянуть о вещах, которые вам необходимо учитывать, если вы хотите написать код для того же. Итак, вот они:
| Конечная точка | https://wamsbluclus001rest-hs.cloudapp.net/API/Assets(‘assetid’)/AccessPolicies
ИЛИ URI, полученный при проверке перенаправления (см. раздел « Подключение к медиа-службе » в записи блога об управлении активами) и добавьте к этому «Assets (‘<assembly>>) / AccessPolicies» [Не забудьте заменить <assetid> фактическим значением сборки |
| HTTP метод | ПОЛУЧИТЬ |
| Заголовки запроса | DataServiceVersion
MaxDataServiceVersion x-ms-версия Авторизация |
| принимать | Применение / JSON; OData = многословным |
Завершение
В этом посте мы узнали о REST API для управления политиками доступа в Media Service. Вот полный исходный код того, что мы уже сделали. Как я уже говорил в моем предыдущем посте, это определенно не лучший код и требует много оптимизации / рефакторинга. Пожалуйста, не стесняйтесь изменять код в соответствии с вашими потребностями.
MediaServiceContext.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Web;
using Newtonsoft.Json;
using System.Globalization;
using System.IO;
using Newtonsoft.Json.Linq;
namespace WAMSRestWrapper
{
public class MediaServiceContext
{
private const string acsEndpoint = "https://wamsprodglobal001acs.accesscontrol.windows.net/v2/OAuth2-13";
private const string acsRequestBodyFormat = "grant_type=client_credentials&client_id={0}&client_secret={1}&scope=urn%3aWindowsAzureMediaServices";
private string _accountName;
private string _accountKey;
private string _accessToken;
private DateTime _accessTokenExpiry;
private string _wamsEndpoint = "https://wamsbluclus001rest-hs.cloudapp.net/API/";
/// <summary>
/// Creates a new instance of <see cref="MediaServiceContext"/>
/// </summary>
/// <param name="accountName">
/// Media service account name.
/// </param>
/// <param name="accountKey">
/// Media service account key.
/// </param>
public MediaServiceContext(string accountName, string accountKey)
{
this._accountName = accountName;
this._accountKey = accountKey;
}
/// <summary>
/// Gets the access token. If access token is not yet fetched or the access token has expired,
/// it gets a new access token.
/// </summary>
public string AccessToken
{
get
{
if (string.IsNullOrWhiteSpace(_accessToken) || _accessTokenExpiry < DateTime.UtcNow)
{
var tuple = FetchAccessToken();
_accessToken = tuple.Item1;
_accessTokenExpiry = tuple.Item2;
}
return _accessToken;
}
}
/// <summary>
/// Gets the endpoint for making REST API calls.
/// </summary>
public string WamsEndpoint
{
get
{
return _wamsEndpoint;
}
}
/// <summary>
/// This function makes the web request and gets the access token.
/// </summary>
/// <returns>
/// <see cref="System.Tuple"/> containing 2 items -
/// 1. The access token.
/// 2. Token expiry date/time.
/// </returns>
private Tuple<string, DateTime> FetchAccessToken()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(acsEndpoint);
request.Method = HttpVerbs.Post;
string requestBody = string.Format(CultureInfo.InvariantCulture, acsRequestBodyFormat, _accountName, HttpUtility.UrlEncode(_accountKey));
request.ContentLength = Encoding.UTF8.GetByteCount(requestBody);
request.ContentType = "application/x-www-form-urlencoded";
using (StreamWriter streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(requestBody);
}
using (var response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream(), true))
{
var returnBody = streamReader.ReadToEnd();
var acsToken = JsonConvert.DeserializeObject<AcsToken>(returnBody);
return new Tuple<string, DateTime>(acsToken.access_token, DateTime.UtcNow.AddSeconds(acsToken.expires_in));
}
}
}
/// <summary>
/// This function checks if we need to redirect all WAMS requests.
/// </summary>
public void CheckForRedirection()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(WamsEndpoint);
request.AllowAutoRedirect = false;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, AccessToken));
request.Method = HttpVerbs.Get;
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.MovedPermanently)
{
string newLocation = response.Headers["Location"];
if (!newLocation.Equals(_wamsEndpoint))
{
_wamsEndpoint = newLocation;
_accessToken = string.Empty;//So that we can force to get a new access token.
_accessTokenExpiry = DateTime.MinValue;
}
}
}
}
public Asset GetAssetReference(string assetId)
{
return new Asset(this, assetId);
}
public Asset GetAssetReference()
{
return new Asset(this);
}
/// <summary>
/// List all assets in a media service.
/// </summary>
/// <returns>
/// </returns>
public IEnumerable<Asset> ListAssets()
{
List<Asset> assets = new List<Asset>();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(CultureInfo.InvariantCulture, "{0}Assets", WamsEndpoint));
request.Accept = RequestContentType.Json;
request.Method = HttpVerbs.Get;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, AccessToken));
request.Headers.Add(RequestHeaders.DataServiceVersion, RequestHeaderValues.DataServiceVersion);
request.Headers.Add(RequestHeaders.MaxDataServiceVersion, RequestHeaderValues.MaxDataServiceVersion);
using (var response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream(), true))
{
var returnBody = streamReader.ReadToEnd();
JObject responseJsonObject = JObject.Parse(returnBody);
var items = responseJsonObject["d"]["results"];
foreach (var d in items)
{
var Id = d.Value<string>("Id");
var State = (AssetState)d.Value<int>("State");
var Options = (AssetEncryptionOption)d.Value<int>("Options");
var AlternateId = d.Value<string>("AlternateId");
var Created = d.Value<DateTime>("Created");
var LastModified = d.Value<DateTime>("LastModified");
var Name = d.Value<string>("Name");
assets.Add(new Asset(this, Id)
{
Name = Name,
State = State,
Options = Options,
AlternateId = AlternateId,
Created = Created,
LastModified = LastModified,
});
}
}
}
return assets;
}
public AccessPolicy GetAccessPolicyReference(string accessPolicyId)
{
return new AccessPolicy(this, accessPolicyId);
}
public AccessPolicy GetAccessPolicyReference(string name, TimeSpan durationInMinutes, AccessPolicyPermission permission)
{
return new AccessPolicy(this, name, durationInMinutes, permission);
}
/// <summary>
/// List all access policies in a media service.
/// </summary>
/// <returns>
/// </returns>
public IEnumerable<AccessPolicy> ListAccessPolicies()
{
List<AccessPolicy> accessPolicies = new List<AccessPolicy>();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(CultureInfo.InvariantCulture, "{0}AccessPolicies", WamsEndpoint));
request.Accept = RequestContentType.Json;
request.Method = HttpVerbs.Get;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, AccessToken));
request.Headers.Add(RequestHeaders.DataServiceVersion, RequestHeaderValues.DataServiceVersion);
request.Headers.Add(RequestHeaders.MaxDataServiceVersion, RequestHeaderValues.MaxDataServiceVersion);
using (var response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream(), true))
{
var returnBody = streamReader.ReadToEnd();
JObject responseJsonObject = JObject.Parse(returnBody);
var items = responseJsonObject["d"]["results"];
foreach (var d in items)
{
var Id = d.Value<string>("Id");
var DurationInMinutes = TimeSpan.FromMinutes(d.Value<double>("DurationInMinutes"));
var Permissions = (AccessPolicyPermission)d.Value<int>("Permissions");
var Name = d.Value<string>("Name");
var Created = d.Value<DateTime>("Created");
var LastModified = d.Value<DateTime>("LastModified");
accessPolicies.Add(new AccessPolicy(this, Id)
{
Name = Name,
DurationInMinutes = DurationInMinutes,
Permissions = Permissions,
Created = Created,
LastModified = LastModified,
});
}
}
}
return accessPolicies;
}
}
}
AccessPolicy.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Net;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace WAMSRestWrapper
{
/// <summary>
/// Class representing an access policy in a media service
/// </summary>
public class AccessPolicy
{
private readonly MediaServiceContext _context;
/// <summary>
/// Creates an instance of <see cref="AccessPolicy"/>
/// </summary>
/// <param name="context">
/// <see cref="MediaServiceContext"/>
/// </param>
internal AccessPolicy(MediaServiceContext context)
{
_context = context;
}
/// <summary>
/// Creates an instance of <see cref="AccessPolicy"/>
/// </summary>
/// <param name="context">
/// <see cref="MediaServiceContext"/>
/// </param>
/// <param name="id">
/// Access policy id
/// </param>
internal AccessPolicy(MediaServiceContext context, string id)
: this(context)
{
Id = id;
}
/// <summary>
/// Creates an instance of <see cref="AccessPolicy"/>
/// </summary>
/// <param name="context">
/// <see cref="MediaServiceContext"/>
/// </param>
/// <param name="name">
/// Access policy friendly name.
/// </param>
/// <param name="durationInMinutes">
/// Timespan for which this access policy will be effective.
/// </param>
/// <param name="permissions">
/// Effective permissions
/// </param>
internal AccessPolicy(MediaServiceContext context, string name, TimeSpan durationInMinutes, AccessPolicyPermission permissions) : this(context)
{
Name = name;
DurationInMinutes = durationInMinutes;
Permissions = permissions;
}
/// <summary>
/// Access policy Id.
/// </summary>
public string Id
{
get;
internal set;
}
/// <summary>
/// Access policy friendly name.
/// </summary>
public string Name
{
get;
internal set;
}
/// <summary>
/// Timespan for which this access policy will be effective.
/// </summary>
public TimeSpan DurationInMinutes
{
get;
internal set;
}
/// <summary>
/// Effective permissions
/// </summary>
public AccessPolicyPermission Permissions
{
get;
internal set;
}
/// <summary>
/// Date/time access policy was created.
/// </summary>
public DateTime Created
{
get;
internal set;
}
/// <summary>
/// Date/time access policy was last modified.
/// </summary>
public DateTime LastModified
{
get;
internal set;
}
/// <summary>
/// Creates an access policy.
/// </summary>
public void Create()
{
if (string.IsNullOrWhiteSpace(Name))
{
Name = Guid.NewGuid().ToString();
}
string accessPolicyCreateRequestPayloadFormat = @"{0} ""Name"": ""{1}"", ""DurationInMinutes"": ""{2}"", ""Permissions"":""{3}"" {4}";
string requestBody = string.Format(CultureInfo.InvariantCulture, accessPolicyCreateRequestPayloadFormat, "{", Name, DurationInMinutes.TotalMinutes, (int)Permissions, "}");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(CultureInfo.InvariantCulture, "{0}AccessPolicies", _context.WamsEndpoint));
request.Method = HttpVerbs.Post;
request.ContentType = RequestContentType.Json;
request.Accept = RequestContentType.Json;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, _context.AccessToken));
request.Headers.Add(RequestHeaders.DataServiceVersion, RequestHeaderValues.DataServiceVersion);
request.Headers.Add(RequestHeaders.MaxDataServiceVersion, RequestHeaderValues.MaxDataServiceVersion);
request.ContentLength = Encoding.UTF8.GetByteCount(requestBody);
using (StreamWriter streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(requestBody);
}
using (var response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream(), true))
{
var returnBody = streamReader.ReadToEnd();
JObject responseJsonObject = JObject.Parse(returnBody);
var d = responseJsonObject["d"];
Id = d.Value<string>("Id");
DurationInMinutes = TimeSpan.FromMinutes(d.Value<double>("DurationInMinutes"));
Permissions = (AccessPolicyPermission)d.Value<int>("Permissions");
Name = d.Value<string>("Name");
Created = d.Value<DateTime>("Created");
LastModified = d.Value<DateTime>("LastModified");
}
}
}
/// <summary>
/// Deletes the access policy.
/// </summary>
public void Delete()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(CultureInfo.InvariantCulture, "{0}AccessPolicies('{1}')", _context.WamsEndpoint, Id));
request.Method = HttpVerbs.Delete;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, _context.AccessToken));
request.Headers.Add(RequestHeaders.DataServiceVersion, RequestHeaderValues.DataServiceVersion);
request.Headers.Add(RequestHeaders.MaxDataServiceVersion, RequestHeaderValues.MaxDataServiceVersion);
var response = (HttpWebResponse)request.GetResponse();
}
/// <summary>
/// Gets information about an access policy.
/// </summary>
public void Get()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format(CultureInfo.InvariantCulture, "{0}AccessPolicies('{1}')", _context.WamsEndpoint, Id));
request.Method = HttpVerbs.Get;
request.Accept = RequestContentType.Json;
request.Headers.Add(RequestHeaders.XMsVersion, RequestHeaderValues.XMsVersion);
request.Headers.Add(RequestHeaders.Authorization, string.Format(CultureInfo.InvariantCulture, RequestHeaderValues.Authorization, _context.AccessToken));
request.Headers.Add(RequestHeaders.DataServiceVersion, RequestHeaderValues.DataServiceVersion);
request.Headers.Add(RequestHeaders.MaxDataServiceVersion, RequestHeaderValues.MaxDataServiceVersion);
using (var response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream(), true))
{
var returnBody = streamReader.ReadToEnd();
JObject responseJsonObject = JObject.Parse(returnBody);
var d = responseJsonObject["d"];
Id = d.Value<string>("Id");
DurationInMinutes = TimeSpan.FromMinutes(d.Value<double>("DurationInMinutes"));
Permissions = (AccessPolicyPermission)d.Value<int>("Permissions");
Name = d.Value<string>("Name");
Created = d.Value<DateTime>("Created");
LastModified = d.Value<DateTime>("LastModified");
}
}
}
}
public enum AccessPolicyPermission
{
None = 0,
Read = 1,
Write = 2,
Delete = 4,
List = 8,
}
}
Резюме
Вот именно для этого поста. В следующем посте мы рассмотрим дополнительные функции API REST и расширим эту библиотеку. Я надеюсь, что вы нашли эту информацию полезной. Как всегда, если вы обнаружите некоторые проблемы с этим сообщением в блоге, пожалуйста, немедленно сообщите мне, и я исправлю их как можно скорее.
Так долго и следите за обновлениями!