将 ASP.NET API 连接到 MySQL 数据库

问题描述 投票:0回答:1

如何连接到 ASP.NET API (.Net 8) 控制器中的 MySQL 数据库。 两者都在单独的 docker 容器中运行。

这是我的 docker-compose.yml:

version: '3.4'

services:
  database:
    container_name: DB
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=1234
      - MYSQL_DATABASE=db
      - MYSQL_USER=user
      - MYSQL_PASSWORD=secretpassword
      - MYSQL_ALLOW_EMPTY_PASSWORD=1
    volumes:
      - dbdata:/var/lib/mysql
      - ./MySqlScripts/init.sql:/docker-entrypoint-initdb.d/1.sql:ro
    restart: on-failure
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10
    ports:
      - 3306:3306
    command: --default-authentication-plugin=mysql_native_password

  api:
    container_name: API
    build: 
      context: .
      dockerfile: API/Dockerfile
    ports:
      - 5092:8080
    depends_on:
      - database

volumes:
  dbdata:

我想使用 MySql.Data(NuGet-Package)。

我尝试使用 docker-compose 文件的此配置进行连接,但它总是导致我收到“没有可用的 MySQL 主机”。

mysql asp.net docker api docker-compose
1个回答
1
投票

首先,您必须向 API 添加控制器或创建如下端点:

// here is only the endpoint
[HttpGet]
[Route("dbcheck")]
public IActionResult DbConnect() {
    return Ok();
}

然后从 NuGet 添加 MySqlConnection

string connectionString = "";
MySqlConnection connection = new MySqlConnection(connectionString)

如您所见,您必须定义一个字符串(connectionString)。 对于该字符串的内容,我添加了以下接口来读取 appsettings.json 中的设置。 (见下文,稍后我会展示)

private readonly IConfiguration Configuration;

public NameOfTheController(IConfiguration configuration) {
    Configuration = configuration;
}

现在可以像这样使用它了,你还可以看到第一个SQL命令:

string connectionString = Configuration["ConnectionStrings:essenskasse"] ?? "";
MySqlConnection connection = new MySqlConnection(connectionString)

MySqlCommand command = new MySqlCommand("SELECT * FROM Test", con);

此后即可建立连接。 要执行该命令,请使用 MySqlDataReader 并将读取器的结果填充到 DataTable 中:

connection.Open();
MySqlDataReader reader = command.ExecuteReader();
DataTable dataTable = new DataTable();
dataTable.Load(reader);
reader.Close();
connection.Close();

不要忘记最后的connection.Close()

这是一个完整的演示控制器:

using Microsoft.AspNetCore.Mvc;
using MySql.Data.MySqlClient;
using System.Data;

namespace API.Controllers {

    [Route("api/[controller]")]
    [ApiController]
    public class DemoController : ControllerBase {

        private readonly IConfiguration Configuration;

        public DemoController(IConfiguration configuration) {
            Configuration = configuration;
        }

        [HttpGet, Route("dbcheck")]
        public IActionResult DbConnect() {
            try {
                MySqlConnection connection = new MySqlConnection(Configuration["ConnectionStrings:mysql"]);

                MySqlCommand command = new MySqlCommand("SELECT * FROM Test", connection);

                connection.Open();
                MySqlDataReader reader = command.ExecuteReader();
                DataTable dataTable = new DataTable();
                dataTable.Load(reader);
                reader.Close();
                connection.Close();

                return Ok();
            }
            catch (Exception ex) {
                return BadRequest(ex.ToString());
            }
        }
    }
}

这是 API 的 appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "mysql": "Server=database;Port=3306;Uid=user;Pwd=secretpassword;Database=db;SslMode=None;"
  }
}
使用

SslMode=None是因为:https://stackoverflow.com/a/78042591

您也无法在 docker 上下文中连接到 localhost:3306。 相反,您应该使用服务名称,您的是数据库,所以我插入它。

© www.soinside.com 2019 - 2024. All rights reserved.