无法在运行时从 IIS 中托管的 ASP.NET 核心应用设置 ODBC 源
Can't set ODBC source at runtime from an ASP.NET Core app hosted in IIS
我有一个 ASP.NET 核心应用程序,旨在使用完整的 .NET Framework 4.6,其中包含我在 Startup.cs 中调用的 ODBC 中创建 DSN 的部分代码:
...
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"] + "[=12=]";
Attributes += "DESCRIPTION=Temp DSN" + "[=12=]";
Attributes += "DSN=" + DSNBaseOperativa + "[=12=]";
Attributes += "DATABASE=" + config["SQLConnection:Database"] + "[=12=]";
//'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 用户源,没有问题。
但是当我尝试在 Windows Server 2012 R2 上托管 IIS 服务器时,它不起作用。 IIS8 是否有阻止这种情况的限制?
IIS 的用户 运行 没有必要的权限。
为此应用程序从应用程序池中选择不同的用户解决了该问题。
我有一个 ASP.NET 核心应用程序,旨在使用完整的 .NET Framework 4.6,其中包含我在 Startup.cs 中调用的 ODBC 中创建 DSN 的部分代码:
...
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"] + "[=12=]";
Attributes += "DESCRIPTION=Temp DSN" + "[=12=]";
Attributes += "DSN=" + DSNBaseOperativa + "[=12=]";
Attributes += "DATABASE=" + config["SQLConnection:Database"] + "[=12=]";
//'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 用户源,没有问题。
但是当我尝试在 Windows Server 2012 R2 上托管 IIS 服务器时,它不起作用。 IIS8 是否有阻止这种情况的限制?
IIS 的用户 运行 没有必要的权限。
为此应用程序从应用程序池中选择不同的用户解决了该问题。