Не удается установить источник ODBC во время выполнения из приложения ASP.NET Core, размещенного в IIS

У меня есть приложение ASP.NET Core, предназначенное для использования Full .NET Framework 4.6, которое содержит часть кода, в которой я создаю DSN в ODBC, вызываемый в Startup.cs:

...
 public void ConfigureServices(IServiceCollection services)
        {
            services.ConfigureSqlContext(Configuration);
            services.CrearDSN(Configuration);
...

И в ServiceExtensions.cs:

private const short ODBC_ADD_DSN = 1; //' Add user data source 
       private const short ODBC_CONFIG_DSN = 2; //' Configure (edit) data source 
       source 
        private const int vbAPINull = 0;

    public static void CrearDSN(this IServiceCollection services, IConfiguration config)
            {
                //DSNBaseOperativa = Replace(Left((My.Settings.Servidor & My.Settings.BaseDatos & Application.ProductName), 32), "\", "") 'El nombre tiene como maximo 32 caracteres.

            //IOptions<ConnectionODBC> odbcsettings;

            string Driver = "SQL Server"; 
            int ReturnValue;
            string Attributes;

            //string name = config["SQLconnection:Server"] + config["SQLconnection:Database"] + "InteliBS";
            string name = config["SQLConnection:Server"] + config["SQLConnection:Database"] + "InteliBS";
            string DSNBaseOperativa =  name.Length > 32 ? name.Substring(0, 32).Replace( "\\", "") : name.Replace("\\", ""); //'El nombre tiene como maximo 32 caracteres.

            Attributes = "SERVER = " + config["SQLConnection:Server"] + "\0";
            Attributes += "DESCRIPTION=Temp DSN" + "\0";
            Attributes += "DSN = " + DSNBaseOperativa + "\0";
            Attributes += "DATABASE = " + config["SQLConnection:Database"] + "\0";
            //'To show dialog, use Form1.Hwnd instead of vbAPINull. 
            ReturnValue = SQLConfigDataSource(vbAPINull, ODBC_ADD_DSN, Driver, Attributes); //TODO: Poder regresar el valor en debug o pararlo en caso 0
            if (ReturnValue != 0){
                System.Diagnostics.Debug.WriteLine("Se ha cargado un DSN de ODBC: " + DSNBaseOperativa, "INFO");
                config["ConnectionODBC:DSN"] = DSNBaseOperativa;
                config["ConnectionODBC:Description"] = "Temp DSN";
                config["ConnectionODBC:Server"] = config["SQLConnection:Server"];
                config["ConnectionODBC:Database"] = config["SQLConnection:Database"];
                config["ConnectionODBC:Userid"] = config["SQLConnection:Userid"];
                config["ConnectionODBC:Password"] = config["SQLConnection:Password"];

                services.Configure<ConnectionODBC>(config.GetSection("ConnectionODBC"));
            }
            else
            {
                System.Diagnostics.Debug.WriteLine("No se pudo crear un DSN de ODBC", "INFO");
            }

        }

// Use DllImport to import the Win32 SQLConfigDataSource function.
        [DllImport("ODBCCP32.DLL", CharSet = CharSet.Ansi)]
        private static extern int SQLConfigDataSource(int hwndParent, int ByValfRequest, string lpszDriver, string lpszAttributes);

Может быть, вам интересно, почему я пытаюсь настроить ODBC вместо обычной строки подключения SQL. Причина в устаревшей библиотеке, которая требует этого в некоторых частях приложения, которые я не буду объяснять. Все остальное, как обычно, использует Entity Framework.

Когда я запускаю свое приложение из Visual Studio 2017 с помощью IISExpress, он работает как шарм. Он создает источник пользователя ODBC без проблем, если он не существует.

Но когда я пытаюсь разместить его на сервере IIS на Windows Server 2012 R2, это не работает. Есть ли ограничение со стороны IIS8, которое этому препятствует?

Во время хостинга в IIS пробовали ли вы включить настройку Enable 32 bit Applicaiton для пула приложений?

Mohsin Mehmood 07.01.2019 08:47

Нет. Как это может быть связано, если мое приложение 64-битное?

Mr_LinDowsMac 07.01.2019 08:57

Поскольку ваш DSN может быть создан с использованием 32-битного ODBC. firehousesoftware.com/webhelp/FHCADMonitor/Content/…

Mohsin Mehmood 07.01.2019 09:00

Я включил его, но он ничего не делает, 64-битные / 32-битные источники ODBC такие же.

Mr_LinDowsMac 08.01.2019 08:31

Верно ли возвращаемое значение SQLConfigDataSource?

Simon Mourier 09.01.2019 20:02

У меня нет возможности узнать. Журналы просто информируют, где происходит сбой запроса в приложении mvc в методе или контроллере, но не содержат информации о том, что происходит в классах Startup.cs или ServiceExtension. Единственное, что подозревает, что DSN не создается, - это потому, что он не нашел строку, потому что генерирует исключение, чтобы привести к 500. Также я проверяю себя в источниках ODBC и не добавляюсь,

Mr_LinDowsMac 09.01.2019 20:16

Вы должны проверить наличие ошибок. Используйте отладку, трассировку, события, файл, что угодно. Если SQLConfigDataSource возвращает false, необходимо вызвать SQLInstallerError, чтобы определить причину. Скорее всего, существует проблема с безопасностью или у запущенного пользователя (пула) IIS недостаточно прав для записи DSN. Вы используете ODBC_ADD_DSN, вы пробовали ODBC_ADD_SYS_DSN?

Simon Mourier 10.01.2019 18:49

На самом деле я проверяю наличие ошибок, перейдя в среду разработки, именно так я заметил, когда код выдает исключение, но ничего о SqlConfigDataSource или ничего при запуске. Возможно, неплохо было бы проверить права пользователей пула. Позвольте мне проверить.

Mr_LinDowsMac 10.01.2019 19:03

@SimonMourier Я выбрал другого пользователя в пуле приложений для этого приложения в IIS и работал. Спасибо.

Mr_LinDowsMac 11.01.2019 06:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
582
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У пользователя, от имени которого был запущен IIS, не было необходимых разрешений.

Выбор другого пользователя из пула приложений для этого приложения решил проблему.

Другие вопросы по теме