Функции Azure v2 Строка подключения из настроек приложения - PullRequest
0 голосов
/ 22 марта 2019

Я создал простую веб-службу Azure Functions v2, которая подключается к базе данных SQL Azure, запускает хранимую процедуру с 3 параметрами и возвращает результат в виде вывода JSON.Он работает как сейчас (со строкой соединения в файле run.csx).

Но как мне получить строку соединения из настроек приложения?

Я пробовал разные руководстваздесь и в других местах.Но все, что я могу найти, это длинный список ссылок и целый набор кода, который мне нужно добавить.Я следовал инструкциям к письму (также установил значения в настройках приложения), но он просто не будет работать.Я довольно новичок в C #, так что, возможно, я просто не понимаю, что я должен делать.

В любом случае, это мой код и предлагаемое исправление, насколько я могускажи:

#r "Newtonsoft.Json"
#r "System.Data"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Data;
using System.Data.SqlClient;

public static async Task<ActionResult> Run(HttpRequest req, ILogger log)
{
   log.LogInformation("C# HTTP trigger function processed a request.");

   string login = req.Query["login"];
   string pwd = req.Query["password"];
   string TransID = req.Query["TransID"];

   string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
   dynamic data = JsonConvert.DeserializeObject(requestBody);
   login = login ?? data?.login;
   pwd = pwd ?? data?.password;
   TransID = TransID ?? data?.TransID;

   var cnnString = "Server=MyServer;Database=WebServices;User Id=MyUser;Password=MyPassword;Encrypt=True;";

        try
        {
            DataTable table = new DataTable();
            SqlConnection connection = new SqlConnection(cnnString);
            SqlCommand cmd = new SqlCommand("sp_GetRegRW", connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@Login", login));
            cmd.Parameters.Add(new SqlParameter("@Password", pwd));
            cmd.Parameters.Add(new SqlParameter("@TransID", TransID));
            await connection.OpenAsync();
            using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
            {
                adapter.Fill(table);
            }

            return (ActionResult)new OkObjectResult(JsonConvert.SerializeObject(table));
        }
        catch (SqlException sqlex)
        {
            return (ActionResult)new OkObjectResult($"The following SqlException happened: {sqlex.Message}");
        }
        catch (Exception ex)
        {
            return (ActionResult)new OkObjectResult($"The following Exception happened: {ex.Message}");
        }

}

предлагаемое решение:

#r "Newtonsoft.Json"
#r "System.Data"
#r "Microsoft.Extensions.Configuration"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Extensions.Configuration;

public static async Task<ActionResult> Run(HttpRequest req, ILogger log, ExecutionContext context)
{
   var config = new ConfigurationBuilder()
    .SetBasePath(context.FunctionAppDirectory)
    .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
    .AddEnvironmentVariables()
    .Build();

   var cnnString =config.GetConnectionString("connWS");
   var setting1 = config["Setting1"];

   log.LogInformation(cnnString);
   log.LogInformation(setting1);
   log.LogInformation("C# HTTP trigger function processed a request.");

   string login = req.Query["login"];
   string pwd = req.Query["password"];
   string TransID = req.Query["TransID"];

   string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
   dynamic data = JsonConvert.DeserializeObject(requestBody);
   login = login ?? data?.login;
   pwd = pwd ?? data?.password;
   TransID = TransID ?? data?.TransID;

        try
        {
            DataTable table = new DataTable();
            SqlConnection connection = new SqlConnection(cnnString);
            SqlCommand cmd = new SqlCommand("sp_GetRegRW", connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@Login", login));
            cmd.Parameters.Add(new SqlParameter("@Password", pwd));
            cmd.Parameters.Add(new SqlParameter("@TransID", TransID));
            await connection.OpenAsync();
            using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
            {
                adapter.Fill(table);
            }

            return (ActionResult)new OkObjectResult(JsonConvert.SerializeObject(table));
        }
        catch (SqlException sqlex)
        {
            return (ActionResult)new OkObjectResult($"The following SqlException happened: {sqlex.Message}");
        }
        catch (Exception ex)
        {
            return (ActionResult)new OkObjectResult($"The following Exception happened: {ex.Message}");
        }

}

1 Ответ

0 голосов
/ 25 марта 2019

В функции v2 вы должны использовать Environment.GetEnvironmentVariable("string_name",EnvironmentVariableTarget.Process) для получения значений из настроек приложения и строк подключения.

Примечание : При использовании вышеуказанного метода первый параметр зависит от типа. Это означает, что когда тип строки подключения равен SQLAZURE, то первый параметр должен быть SQLAZURE + CONNSTR + _stringName.

Снимок экрана приведен ниже: enter image description here

Пример кода:

//for connection string
string connStr = Environment.GetEnvironmentVariable("SQLAZURECONNSTR_sqldb_connection",EnvironmentVariableTarget.Process);
log.LogInformation("the connection string is: " + connStr);

И снимок результата:

enter image description here

Я получаю следующую ошибку: свойство ConnectionString не было инициализировано.

Вероятно, вам следует создать экземпляр SqlConnection со строкой подключения и открыть это подключение, прежде чем пытаться выполнить какую-либо команду .

SqlConnection con = new SqlConnection("connStr");
await con.OpenAsync();
...