Статьи

Управление политиками доступа через REST API в Azure Media Service

В последнем посте о 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 и расширим эту библиотеку. Я надеюсь, что вы нашли эту информацию полезной. Как всегда, если вы обнаружите некоторые проблемы с этим сообщением в блоге, пожалуйста, немедленно сообщите мне, и я исправлю их как можно скорее.

Так долго и следите за обновлениями!