Microsoft AnalysisServices - запуск и остановка сервера с использованием Azure функций - PullRequest
0 голосов
/ 29 января 2020

Я хотел написать Azure функцию для остановки и возобновления MS Analysis Sevice. Мне было поручено сделать это с помощью API Resume и API Suspend . Это мой первый раз с C# (у меня есть фон Python / Javascript). Что я делаю неправильно? Может ли кто-нибудь предоставить правильное решение? Буду благодарен от всего сердца.

Вот мой текущий пример кода:

using System;
using System.Net;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

static HttpClient client = new HttpClient();
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req)
{
    var subscriptionId = "mySId";
    var resourceGroupName = "myRGName";
    var serverName = "mySName";
    var APIurl = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AnalysisServices/servers/{serverName}/resume?api-version=2017-08-01";

    var response = await client.PostAsync(APIurl, null);
    string result = await response.Content.ReadAsStringAsync();
    return req.CreateResponse(HttpStatusCode.OK);
}

Это то, что я получаю в консоли. Сервер не останавливается, хотя. enter image description here

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Поскольку для API "Resume", упомянутого в вашем вопросе, требуется Azure Active Directory OAuth2 Flow, вам необходимо сначала получить токен доступа, обратившись к этому учебнику , а затем использовать токен доступа для запросите этот API в вашем коде функции.

В коде вашего приложения функции вам нужно установить токен доступа, который мы получили выше, в качестве значения Авторизации, а затем выполнить повторный запрос.

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token");
0 голосов
/ 07 февраля 2020

Для тех, кто в трудной ситуации - это мое полное рабочее решение.

using System;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Net.Http.Headers;
using System.Net;
using System.Net.Http;
using System.Collections.Generic;
using Microsoft.IdentityModel.Clients.ActiveDirectory;

namespace ManageAS
{
    public class ManageAS
    {
        string accessToken = null;
        string responseString = null;
        string serverStatus = null;
        string serverFullURI = Environment.GetEnvironmentVariable("FULL_SERVER_URI");
        static string shortServerName = Environment.GetEnvironmentVariable("SHORT_SERVER_NAME");
        string resourceURI = "https://management.core.windows.net/";
        string clientID = Environment.GetEnvironmentVariable("CLIENT_ID");
        string clientSecret = Environment.GetEnvironmentVariable("CLIENT_SECRET");
        string tenantID = Environment.GetEnvironmentVariable("TENANT_ID");
        static string resourceGroupName = Environment.GetEnvironmentVariable("RESOURCE_GROUP_NAME");
        static string subscriptionId = Environment.GetEnvironmentVariable("SUBSCRIPTION_ID");
        static Uri apiURI = null;

        [FunctionName("PerformAction")]
        public async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req,
            ILogger log)
        {    
            await GetAccessToken();
            await GetServerStatus(accessToken);

            if (serverStatus == "Paused")
            {
                apiURI = new Uri(string.Format("https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.AnalysisServices/servers/{2}/resume?api-version=2017-08-01", subscriptionId, resourceGroupName, shortServerName));
                this.responseString = await ServerManagement(apiURI, accessToken);
            }

            if (serverStatus == "Succeeded")
            {
                apiURI = new Uri(string.Format("https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.AnalysisServices/servers/{2}/suspend?api-version=2017-08-01", subscriptionId, resourceGroupName, shortServerName));
                this.responseString = await ServerManagement(apiURI, accessToken);
            }

            return req.CreateResponse(HttpStatusCode.OK, responseString);
        }

        protected async Task<string> GetAccessToken()
        {
            string authority = "https://login.microsoftonline.com/" + tenantID;
            AuthenticationContext authenticationContext = new AuthenticationContext(authority);
            var token = await authenticationContext.AcquireTokenAsync(resourceURI, new ClientCredential(clientID, clientSecret));
            accessToken = token.AccessToken;
            return accessToken;
        }

        protected async Task<string> ServerManagement(Uri url, string token)
        {
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

            HttpResponseMessage response = await client.PostAsync(url.ToString(), null);
            response.EnsureSuccessStatusCode();
            HttpContent content = response.Content;

            string json;
            json = await content.ReadAsStringAsync();
            return json;
        }

        protected async Task<string> GetServerStatus(string token)
        {
            var url = new Uri(string.Format("https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.AnalysisServices/servers/{2}?api-version=2017-08-01", subscriptionId, resourceGroupName, shortServerName));

            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            HttpResponseMessage response = await client.GetAsync(url.ToString());

            response.EnsureSuccessStatusCode();
            string sJson = await response.Content.ReadAsStringAsync();
            var dictResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(sJson);
            if (!dictResult.ContainsKey("properties")) return null;
            var dictProperties = dictResult["properties"] as Newtonsoft.Json.Linq.JObject;
            if (dictProperties == null || !dictProperties.ContainsKey("state")) return null;
            serverStatus = Convert.ToString(dictProperties["state"]);
            return serverStatus;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...