Повестка дня: Мы пытаемся отобразить наши данные, извлеченные из SQL , в раскрывающемся списке, но вместо прямой передачи мы используем «Функции Azure» который может помочь получить данные из SQL через хранилище ключей
Проблема: Элемент управления Powerapps DropDown / ListBox не может понять выходные данные, заданные функцией Azure.Мы попытались отобразить выходные данные из функций Azure, т. Е. Строка / текст / записи / список / DataRows
Ошибка:
свойство ожидает значения таблицы, но это правило создаетнесовместимые текстовые значения
Что мы сделали:
- Создана функция Azure (предоставлены все необходимые права доступа, такие как удостоверение управляемой службы, добавление приложения в AAD и т. д..) (Протестировав функцию, мы получим ожидаемый вывод)
- Создан API с swagger 2.0
- Создан пользовательский разъем powerapp с указанным выше файлом OpenAPI (Соединитель работает отлично)
- Мы вызываем функцию из холста Powerapp следующим образом:
MCFAzureFunction.RunThis(Button1.Pressed)
Help: Сообщите нам, как лучше всего передать функцию ответных данных fromazure в выпадающий список или элемент управления Powerapp.или мы что-то делаем / упускаем что-то
Код:
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
using System.Data;
using System.Data.SqlClient;
using Newtonsoft.Json;
namespace MCFuncApp
{
public static class Function1
{
private static HttpClient client = new HttpClient();
private static string BuildConnString(string secret, string dbCatalog)
{
return ("Server=********** Timeout=30;");
}
private static string DataTableToJSON(DataTable table)
{
string JSONString = string.Empty;
JSONString = JsonConvert.SerializeObject(table);
return JSONString;
}
[FunctionName("Function1")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
// parse query parameter
string name = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
.Value;
if (name == null)
{
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
name = data?.name;
}
string exampleSecret = "Secret";
string qResponse = "";
if(name != null)
{ // "https://********"
string vaultBaseUrl = "*********";
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback), client);
var secret = (await kvClient.GetSecretAsync(vaultBaseUrl)).Value;
var connString = BuildConnString(secret, "*****");
string query = "*********";
var dt = new DataTable();
using (SqlDataAdapter da = new SqlDataAdapter(query, connString))
{
da.Fill(dt);
}
qResponse = DataTableToJSON(dt);
}
return name == null
? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
: req.CreateResponse(HttpStatusCode.OK, qResponse, "application/json");
}
}
}
Заранее спасибо!