Не удается подключиться к именованному экземпляру SQL Server из ядра ASP.NET, работающего в Docker (Linux) - PullRequest
2 голосов
/ 06 июня 2019

У меня есть приложение, которое должно подключаться к SQL Server, работающему на удаленном сервере с использованием именованного экземпляра.

Используя IISExpress, я могу подключиться к SQL Server, но из Docker (контейнер Linux) это не удается- при доступе к контексту он просто зависает - не выдается исключение или сообщение об ошибке.Например,

var context = serviceScope.ServiceProvider.GetService<AppContext>();
context.Users.ToList();

В отладчике он никогда не достигает обработчика исключений.

Вместо этого я вижу много выводов, подобных этому:

The thread 125 has exited with code 0 (0x0).
The thread 164 has exited with code 0 (0x0).
The thread 0xa4 has exited with code 0 (0x0).

Использование node.js Iможет подключиться к SQL Server даже из докера без проблем.

Я могу подключиться к выпуску SQL Server Developer, работающему на той же машине, что и Docker, из ASP.NET Core в Docker, когда я использую, например, [ipaddress или host.docker.internal], 1433 - к сожалению, на удаленном SQLСервер, я не могу настроить фиксированный порт.

  • работает с использованием IISExpress (работает на Windows)
  • работает при подключении к SQL Server, работающему на компьютере разработчика, при использовании фиксированного портавместо именованного экземпляра (но я не могу изменить наш производственный сервер)
  • работает при использовании node.js!из докера также с именованным экземпляром (оба: с именем хоста или IP-адресом - так что я могу разрешить удаленные имена, брандмауэр не является проблемой)
  • пробовал ASP.NET Core 2.2 и 3.0preview5, используя контейнер Microsoft в качестве базы, напримерОТ mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base

Соединительная строка:

"Data Source=remoteIP\\WEBDB;Initial Catalog=TestDB;User ID=testuser;Password=******;"

Также пробовал с "Интегрированная безопасность = False;"в строке подключения

Аутентификация сервера установлена ​​на смешанную

Я могу воспроизвести это также без Entity Framework:

var conString = "Data Source=remoteIP\\WEBDB;Initial Catalog=TestDB;Integrated Security=False;User ID=testuser;Password=********";

using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Users", conn))
{
   conn.Open();
   var rows = cmd.ExecuteNonQuery();
   Console.WriteLine($"rows: {rows}");
}

Он будет висеть на линии conn.Open();.

Есть идеи, что я мог сделать?

Обновление:

  • неправильно введена строка подключения.
  • обновлен код с полным примером

Редактировать

Это работает:

var conString = "Data Source=10.0.75.1,1433;Initial Catalog=TestDB;Integrated Security=False;User ID=testuser;Password=********";

Это не работает:

var conString = "Data Source=10.0.75.1\\Developer;Initial Catalog=TestDB;Integrated Security=False;User ID=testuser;Password=********";

Я могу пропинговатьУдаленный IP-адрес, а также имя удаленного сервера.

К сожалению, установка mssql-cli на образ ubuntu не удалась из-за отсутствия зависимостей.

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Я использую контейнерное приложение Docker.Я добавил строку подключения следующим образом:

services.AddDbContext<OrderContext>(options =>
            {
                options.UseSqlServer(Configuration["ConnectionString"]);
            });

И моя строка подключения выглядит следующим образом:

Server=sqlserver ; Database=CustomerDb; User Id=sa;Password=8jkGh47hnDw89Haq8LN2

sqlserver - это sql образ, работающий на докере,

sqlserver:
    image: microsoft/mssql-server-linux:latest
    container_name: sqlserver
    ports:
      - "7100"
    environment:
      - ACCEPT_EULA=Y 
      - MSSQL_PID=Developer
      - SA_PASSWORD=8jkGh47hnDw89Haq8LN2
0 голосов
/ 06 июня 2019

Data Source неверно.Именованные экземпляры используют только одну обратную косую черту.Правильный источник:

remoteIP\WEBDB

Обратная косая черта должна быть экранирована , только если строка хранится на носителе, который требует такого экранирования, например, в строке C # или строке JSON.Для языков, связанных с C #, JSON, Javascript и C ++, escape-символом является сам обратный слеш, например:

var connectionString="Data Source=remoteIP\\WEBDB;Initial Catalog=TestDB;User ID=testuser;Password=******;"

или

{
    "ConnectionStrings": {
        "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
    },
}

Литеральные строки C #, файлы XML или INI don 'не требует побега.Следующая строка C # не нуждается в экранировании.

var connectionString=@"Data Source=remoteIP\WEBDB;Initial Catalog=TestDB;User ID=testuser;Password=******;"

Редактировать

Исправление имени - это только одна вещь, которая может быть неправильной.Неправильный адрес может легко передать приложение, в то время как DNS пытается преобразовать нераспознанную строку в действительный IP-адрес.

Другая проблема заключается в том, что контейнеры Docker по умолчанию имеют сетевое подключение no .Вы должны указать, к чему они могут подключаться и как внутренние IP-адреса и порты отображаются на внешние IP-адреса и порты.

Вы можете использовать инструмент CLI SQL Server, mssql-cli для тестированияподключение к серверу без запуска собственного приложения с:

mssql-cli -S InternallyMappedIP\WEBDB -d TestDB -U testuser
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...