REST API с ядром dotnet - PullRequest
       2

REST API с ядром dotnet

0 голосов
/ 01 мая 2018

Спасибо за ваши наблюдения, я применил их с помощью следующего кода, но после тестирования api не возвращает данных. Я даже использовал мою строку подключения вместо dbcontext, но все равно ничего! Я получаю эту ошибку Неверная попытка вызвать FieldCount, когда читатель закрыт, а мой читатель открыт. Я нахожусь в этой ситуации уже неделю, любая помощь. Запрос FromSql просто возвращает сущности одной таблицы. Моя процедура Store принимает параметр и имеет соединения с 4 таблицами. я попытался с запросом «ExecuteSqlCommand», как результат -1 я получаю.

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using ActivaMobileAgent.Persistence;
using Microsoft.EntityFrameworkCore;
using ActivaMobileAgent.Model;
using System.Linq;
using System.Collections.Generic;
using System.Data.SqlClient;
using System;
using Dapper;
using System.Data;
using System.Data.Common;

 namespace ActivaMobileAgent.Controllers
{
    [Route("/api/Policy")]
    public class PolicyController : Controller
    {
    private readonly ActivaMobileAgentDbContext context;

    public PolicyController(ActivaMobileAgentDbContext context) => this.context = context;

    public readonly string connectionString = "Data Source=Localhost;Initial Catalog=HELLOxx;User=sa; Password=Helloxx";

    [HttpGet("{id}")]

    public async Task<IActionResult> GetPolicy(string id)
    {
        using (var connection = new SqlConnection("Data Source=Localhost;Initial Catalog=Helios;User=sa; Password=P@ssw0rd"))
        {
            SqlCommand command = new SqlCommand();
            command.Connection = connection;
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText ="dbo.sproc_Contract_Get";
            command.Parameters.Add(new SqlParameter("@ContractNumber", SqlDbType.VarChar) { Value = id });
            connection.Open();
            using (var result = await command.ExecuteReaderAsync())
            {
                return Json(result);
            }
        }
    }

}

}

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

ExecuteReaderAsync возвращает Task<SqlDataReader>. Это, вероятно, бесполезный тип для сериализации как результат JSON. Он представляет курсор над набором данных, а не сами данные; данные еще не были возвращены из базы данных. Как объясняет эта статья блога , нет встроенного способа превратить SqlDataReader в JSON. Там упоминается несколько способов, но вы должны написать код, который выполняет итерацию SqlDataReader и создает из него результаты.

Как правило, чтобы упростить эту работу, вы используете Object-Relational Mapper , чтобы выполнить эту работу за вас, например: Dapper , который поддерживает хранимые процедуры (отказ от ответственности: Я никогда не использовал Dapper). Entity Framework является обычным для приложений .net, так как он построен Microsoft, но он довольно тяжелый и может быть сложным в использовании.

edit: О - я не заметил, что у вас уже есть Entity Framework DbContext. Это должно позволить вам выполнить хранимую процедуру и изначально сопоставить ее с результатом.

0 голосов
/ 01 мая 2018

Ваш веб-метод не возвращает никаких данных.

Вместо метода, который ничего не возвращает, измените сигнатуру метода на

public async Task<IActionResult> GetPolicy( int id )

Как только вы это сделаете, компилятор будет ожидать, что этот метод вернет некоторые данные. Я полагаю, что хранимый процесс возвращает некоторые данные, поэтому вам придется их где-то поместить. После этого вы можете вернуть значения, используя

return Ok(thedata);

Проверьте, например, метод Ok . Если что-то пошло не так, вы не должны возвращать Ok offcourse, но другой код статуса Http, который указывает, что пошло не так.

Это заставляет меня сказать, что функции в службе REST всегда должны возвращать правильный код состояния HTTP. Следовательно, все ваши методы REST должны возвращать IActionResult или Task, а не только извлекаемые данные

Изменить после редактирования вопроса

Метод ExecuteReader () возвращает класс, который реализует IDataReader. Очевидно, неправильно возвращать устройство чтения данных потребителю вашего веб-сервиса. Вместо этого вам придется использовать IDataReader для чтения данных и использовать эти данные для заполнения какой-то модели, которую вы можете использовать для возврата потребителю вашей услуги.

List<SomeClass> result = new List<SomeClass>();

using (var reader = await command.ExecuteReaderAsync())
{
    while( reader.Read() )
    {
        result.Add(new SomeClass(dr.GetInt32(0), dr.GetString(1));
    }
}

return Ok(result);

Кроме того, я советую вам не форматировать данные самостоятельно в json, xml или что-либо еще. Пусть ASP.NET справится с этим за вас. ASP.NET будет сериализовать результаты в соответствующий формат на основе значения accept-header полученного запроса.

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