Member 12586110 Ответов: 1

C# ASP.NET основной веб-api


Привет, я работаю над миграцией из ASP.NET веб-API для ASP.NET ядро и переписал приведенный ниже код с помощью .net core, но столкнулся с ошибками, где, как этот же код прекрасно работает в ASP.NET веб-API.

public class DataController : Controller
    {
        private IList<string> errors = new List<string>();

        [HttpPost]
        [Route("data/import", Name = "DataImport")]
        public IActionResult Post()
        {
            var rawdata = ConvertToByteArray(Request.Body); //ASP.net core; error
			//var rawdata = ConvertToByteArray(Request.Content.ReadAsStreamAsync().Result); //ASP.net web api
            var rdrec = Encoding.UTF8.GetString(content).Split(new string[] { Environment.NewLine, @"\r" }, StringSplitOptions.None).ToList();
            
            importdata(rdrec);
            if (errors.Count == 0)
                return Ok("POST");
            else
                return Ok(errors);
        }

        private void importdata(IList<string> lines)
        {
            //string connectionString = @"Data Source=localhost;Initial Catalog=TEST_DB;Integrated Security=True";
			string connectionString = ConfigurationManager.ConnectionStrings["SQLDBCONN"].ConnectionString; // Added this to appsettings.json file and get null reference error in ASP.net core; works fine in ASP.net web api
            var message = "";

            var Data = from line in lines
                        let data = line.Split(',')
                        select new filedata
                        {
                            ID = data[0],
                            Type = data[1],
                            Status = data[2],
                            Description = data[3]
                        };               

            using (SqlConnection sqldbConnection = new SqlConnection(connectionString))
            {
                        sqldbConnection.Open();                       
                            foreach (var i in Data)
                            {
                                try
                                {
                                    using (SqlCommand cmd = new SqlCommand("INSERT INTO [dbo].[testImport] ([ID], [Type], [Status], [Description]) VALUES (@ID, @Type, @Status, @Description)", sqldbConnection))
                                    {
                                        cmd.Parameters.AddWithValue("@ID", i.ID);                                      
                                        cmd.Parameters.AddWithValue("@Type", i.Type);
                                        cmd.Parameters.AddWithValue("@Status", i.Status);
                                        cmd.Parameters.AddWithValue("@Description", i.Description);
                                        cmd.ExecuteNonQuery();
                                    }
                                }
                                catch (Exception ex)
                                {
                                    message = ex.StackTrace;
                                    return (message);
                                }
                            }                     

            }

        }
		
        private byte[] ConvertToByteArray(Stream stream)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                return ms.ToArray();
            }
        }		
    }


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

var rawdata = ConvertToByteArray(Request.Body);


2) Установка строки подключения базы данных из appsettings.json ранее мне удалось получить строку подключения fine из файла web.config.

string connectionString = ConfigurationManager.ConnectionStrings["SQLDBCONN"].ConnectionString;


Что я уже пробовал:

Чтобы получить строку подключения базы данных sql во время выполнения, я помещаю строку подключения в файл appsettings.json, но не знаю, как ее вызвать в контроллере.

параметр appsettings.в JSON

{
    "SQLDB": {
        "SQLDBCONN": {
            "MySQLConnStr": "Data Source=datamartprd.multco.us\\SQLSVR,2505;Initial Catalog=BISTG_CLOUD_QAT;User Id=dbsql_bidm__googleapps_qry;Password=wf#Gd5MZw9hJ;"
        }
    }
}


public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("SQLDBCONN")));
}

1 Ответов

Рейтинг:
11

Vincent Maverick Durano

Вместо того чтобы делать:

services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("SQLDBCONN")));


Попробуй:

services.AddDbContext<ApplicationDbContext>(options =>    
 options.UseSqlServer(Configuration.GetConnectionString("SQLDB:SQLDBCONN:MySQLConnStr")));


То GetConnectionString() метод очень ясен, он сначала будет искать ConnectionStrings узел, затем имя. Так что не забудьте включить ConnectionStrings узел или код выдадут ошибку NULL exception.

"ConnectionStrings": {
    "SQLDB": {
      "SQLDBCONN": {
        "MySQLConnStr": "your data source"
      }
    }
  }


Проверьте мою статью на ASP.NET ядро для примера: Начало работы с ядром Entity Framework Core: создание ASP.NET основное приложение с веб-API и разработкой кода в первую очередь

И, наконец, проверьте официальную документацию о: Мигрировать из ASP.NET веб-API для ASP.NET сердечник


Afzaal Ahmad Zeeshan

5ед.

Vincent Maverick Durano

Спасибо! ;)

Member 12586110

Привет, Винсент Маверик Дюрано, большое спасибо за ваш ответ. Я внес изменения в ConfigureServices, как показано ниже.

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SQLDB:SQLDBCONN:MySQLConnStr")));
        }


Как я могу вызвать эту connectionstring для динамического изменения из appsettings во время выполнения в классе контроллера?

string connectionString = ConfigurationManager.ConnectionStrings["SQLDBCONN"].ConnectionString;


При использовании этого я получаю ошибку.

сообщение об ошибке:

AddDbContext был вызван с конфигурацией, но тип контекста 'ApplicationDbContext' объявляет только конструктор без параметров. Это означает, что конфигурация прошла в AddDbContext никогда не будет использоваться. Если конфигурация передается в AddDbContext, то 'ApplicationDbContext' должен объявить конструктор, который принимает DbContextOptions<applicationdbcontext> и должен передать его базовому конструктору для DbContext.

Vincent Maverick Durano

В ASP.NET ядро, вы должны ссылаться на connectionString из конфигурации.Метод GetConnectionString (), например:


string connectionString = Configuration.GetConnectionString("SQLDB:SQLDBCONN:MySQLConnStr");

Member 12586110

Привет, Винсент Маверик Дюрано, Спасибо за ваш ответ. По какой-то причине я не смог реализовать ваше решение, так как столкнулся с ошибками.

Пожалуйста, найдите мое решение ниже и дайте мне знать ваши мысли.

Автозагрузки.в CS
Скрыть   скопировать код

        public IConfiguration Configuration { get; }        public void ConfigureServices(IServiceCollection services)        {            services.AddMvc();            services.AddSingleton<IConfiguration>(Configuration);        }


Контроллер.в CS
Скрыть   скопировать код
        public MyController(IConfiguration configuration)        {            _configuration = configuration;        }	private void importdata(IList<string> lines)        {	    string connectionString = _configuration["SQLDB:SQLDBCONN:MySQLConnStr"];	}


Спасибо.

Vincent Maverick Durano

Я не вижу этого кода в вашем контроллере:

строка connectionString = конфигурация.GetConnectionString("SQLDB:SQLDBCONN:MySQLConnStr");