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

У меня есть приложение 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 User Source без проблем, если он не существует.

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

1 Ответ

0 голосов
/ 11 января 2019

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

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

...