У меня есть приложение 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, которое этому препятствует?
Нет. Как это может быть связано, если мое приложение 64-битное?
Поскольку ваш DSN может быть создан с использованием 32-битного ODBC. firehousesoftware.com/webhelp/FHCADMonitor/Content/…
Я включил его, но он ничего не делает, 64-битные / 32-битные источники ODBC такие же.
Верно ли возвращаемое значение SQLConfigDataSource?
У меня нет возможности узнать. Журналы просто информируют, где происходит сбой запроса в приложении mvc в методе или контроллере, но не содержат информации о том, что происходит в классах Startup.cs или ServiceExtension. Единственное, что подозревает, что DSN не создается, - это потому, что он не нашел строку, потому что генерирует исключение, чтобы привести к 500. Также я проверяю себя в источниках ODBC и не добавляюсь,
Вы должны проверить наличие ошибок. Используйте отладку, трассировку, события, файл, что угодно. Если SQLConfigDataSource возвращает false, необходимо вызвать SQLInstallerError, чтобы определить причину. Скорее всего, существует проблема с безопасностью или у запущенного пользователя (пула) IIS недостаточно прав для записи DSN. Вы используете ODBC_ADD_DSN, вы пробовали ODBC_ADD_SYS_DSN?
На самом деле я проверяю наличие ошибок, перейдя в среду разработки, именно так я заметил, когда код выдает исключение, но ничего о SqlConfigDataSource или ничего при запуске. Возможно, неплохо было бы проверить права пользователей пула. Позвольте мне проверить.
@SimonMourier Я выбрал другого пользователя в пуле приложений для этого приложения в IIS и работал. Спасибо.





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