C # Web API для использования данных Azure SQL Server - PullRequest
0 голосов
/ 14 сентября 2018

Я был бы очень признателен, если бы вы указали мне правильное место или правильную идею.Я не делал C # годами, и я не уверен, что я делаю больше.

По сути, у меня есть база данных MSSQL на основе Azure, из которой мне нужно читать данные и возвращать эти данные в формате JSON для моего приложения для iPhone.API-интерфейсы Azure не позволяют вам читать напрямую из БД, но вы можете создать веб-API .Net и использовать его - так я и пошел.

Я получил первую часть на работу.В этом я могу сделать HTTP-запрос, и Azure отвечает нормально.Я также построил БД и таблицы, и я проверил все это, и это работает.Я также проверил запрос, и он хорошо работает в формате JSON.

Однако мне нужно передать данные в считыватель данных как ответ http, и я не могу понять эту часть.Приложены два ванильных файла ... один, который делает фиктивный HTTP-запрос, а другой - файл соединителя db.

Короче говоря, в файле Function1.cs мне нужно перейти от

: req.CreateResponse (HttpStatusCode.OK, "Hello" + name);to: req.CreateResponse (HttpStatusCode.OK,);

Первый файл: Function1.cs

namespace getOutageAlerts

{открытый статический класс Function1 {[FunctionName("Function1")] открытый статический асинхронный запуск задачи ([HttpTrigger (AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req, журнал TraceWriter) {log.Info ("Триггерная функция HTTP C # обработала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;
        }

        return name == null
            ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
            **:req.CreateResponse(HttpStatusCode.OK, "Hello" + name);**

    }
}

}

Второй файл: DBConnector.cs

using System;
using System.Data.SqlClient;


public class DBConnector
{
    public DBConnector()
    {
        SqlConnection getalertsConnection = new SqlConnection("Server=tcp:xxxxxxxxx.database.windows.net,1433;Initial Catalog=mckMobileAppsDB;Persist Security Info=False;User ID=xxxxxxx;Password=xxxxxxxx;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;");
        SqlCommand cmd = new SqlCommand();
        SqlDataReader reader;

        cmd.CommandText = "SELECT Date_Created As Date, Incident_Number AS Incident, Flash_Summary AS Summary, Service, Business_Impact AS Impact, Incident_Status AS Status from OutagesMobileAppNotifications FOR JSON PATH, Root('Alerts')";
        cmd.CommandType = CommandType.Text;
        cmd.Connection = getalertsConnection;

        getalertsConnection.Open();

        reader = cmd.ExecuteReader();
        // Data is accessible through the DataReader object here.


        getalertsConnection.Close();
    }
}

1 Ответ

0 голосов
/ 14 сентября 2018

Ваш вопрос сформулирован немного неловко, плюс плохое форматирование не помогает. Однако, похоже, что вы хотите вернуть JSON из бессерверной функции Azure. Исходя из этого предположения, я постараюсь ответить.

Чтобы вернуть JSON, вам нужно добавить пакет Newtonsoft.Json. Это просто, в верхней части вашей функции добавьте следующее:

#r "Newtonsoft.Json"
using System.Net;
using System.Text;
using Newtonsoft.Json;
using System.Linq;

(Изменить: добавлено использование оператора для System.Linq, так что выбор доступен для чтения данных.)

В DBConnector, который вы написали, я бы преобразовал читателя в массив объектов и затем сериализовал этот результат в JSON. (Я сократил ваш список полей до jsut 2 для краткости ... вам, очевидно, потребуется добавить весь список.)

var incidents = dataReader.Select(m => new { m.Date, m.Incident }).ToList();
var jsonResult = JsonConvert.SerializeObject(incidents, Formatting.Indented);

Затем верните JSON.

return new HttpResponseMessage(HttpStatusCode.OK) {
    Content = new StringContent(jsonResult, Encoding.UTF8, "application/json")
};

(я пытаюсь сделать это по памяти ... и я не выполнял функции Azure в течение года ... поэтому точный код может отличаться.)

Кроме того ... поскольку вы давно не работали с C # и, возможно, никогда не работали с функциями Azure, может быть проще сохранить все в одной и той же функции. Под этим я подразумеваю, что вам не нужно иметь второй класс / файл ... вы можете просто поместить всю работу с SQL в ваш основной метод. Обычно я считаю это плохой практикой, но в краткосрочной перспективе это может облегчить ваши усилия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...