第一次异步查询后丢失我的应用程序池标识
Losing my App Pool Identity after first async query
我在 IIS 7.5 上安装了 .NET API 运行。 API 在使用 Active Directory 域帐户的应用程序池中 运行,用于针对 SQL 数据库(托管在不同服务器上)进行身份验证。
应用程序池标识的凭据适用于我的一些查询,但其他查询返回以下错误:
The underlying provider failed on Open.
内部异常是:
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
我似乎丢失了我的应用程序池身份凭证,但我不明白为什么。
在我的 API GET:
中的这个调用中可以看到成功然后失败的示例
using (FtpJobsContext db = new FtpJobsContext())
{
Job job = await db.Jobs.FindAsync(guidJobId);
if (job != null)
{
JobDetailAPIModel result = await GetDetails(db, job, NUMBER_OF_EXECUTIONS);
return Ok(result);
}
else
{
return NotFound();
}
}
对 db.jobs
的 FindAsync
调用工作正常。建立连接,并检索适当的作业。
但是,当我将 DbContext 传递给私有方法时,数据库连接似乎更改为匿名。
GetDetails 的定义类似于:
private async Task<JobDetailAPIModel> GetDetails(FtpJobsContext db, Job job, int executionNumber)
{
JobDetailAPIModel result = new JobDetailAPIModel();
ICollection<JobScheduleAPIModel> schedules = new Collection<JobScheduleAPIModel>();
foreach (JobSchedule sched in job.JobSchedules)
{
schedules.Add(new JobScheduleAPIModel(sched));
}
result.JobSchedules = schedules;
ICollection<SSISPackageSummaryAPIModel> packages = new Collection<SSISPackageSummaryAPIModel>();
foreach (SSISPackage pack in job.SSISPackages)
{
packages.Add(new SSISPackageSummaryAPIModel(pack));
}
result.SSISPackages = packages;
ICollection<ExecutionAPIModel> executions = await (from e in db.View_Executions
join p in db.SSISPackages on e.SSISPackageId equals p.SSISPackageId
join j in db.Jobs on p.JobId equals j.JobId
where p.JobId == job.JobId
orderby e.StartTime descending
select new ExecutionAPIModel
{
ExecutionId = e.ExecutionId,
PackageDisplayName = e.PackageDisplayName,
Status = e.Status,
StartTime = e.StartTime,
EndTime = e.EndTime,
Duration = e.Duration
}).Take(executionNumber).ToListAsync();
result.LatestExecutions = executions;
return result;
}
我来自 Web.Config 的连接字符串如下所示:
<add name="{name}" providerName="System.Data.SqlClient" connectionString="Data Source={serverName};Initial Catalog={dbName};Integrated Security=SSPI;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Encrypt=False;TrustServerCertificate=True" />
我在撰写问题时找到了答案,但我想我还是会分享它,以防其他人 运行 遇到类似问题。
问题出在我的连接字符串上。 Pooling=False
强制 Using
语句中的后续连接丢失凭据并恢复为匿名。
将连接字符串更改为 Pooling=True
可解决问题。
我在 IIS 7.5 上安装了 .NET API 运行。 API 在使用 Active Directory 域帐户的应用程序池中 运行,用于针对 SQL 数据库(托管在不同服务器上)进行身份验证。
应用程序池标识的凭据适用于我的一些查询,但其他查询返回以下错误:
The underlying provider failed on Open.
内部异常是:
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
我似乎丢失了我的应用程序池身份凭证,但我不明白为什么。
在我的 API GET:
中的这个调用中可以看到成功然后失败的示例 using (FtpJobsContext db = new FtpJobsContext())
{
Job job = await db.Jobs.FindAsync(guidJobId);
if (job != null)
{
JobDetailAPIModel result = await GetDetails(db, job, NUMBER_OF_EXECUTIONS);
return Ok(result);
}
else
{
return NotFound();
}
}
对 db.jobs
的 FindAsync
调用工作正常。建立连接,并检索适当的作业。
但是,当我将 DbContext 传递给私有方法时,数据库连接似乎更改为匿名。
GetDetails 的定义类似于:
private async Task<JobDetailAPIModel> GetDetails(FtpJobsContext db, Job job, int executionNumber)
{
JobDetailAPIModel result = new JobDetailAPIModel();
ICollection<JobScheduleAPIModel> schedules = new Collection<JobScheduleAPIModel>();
foreach (JobSchedule sched in job.JobSchedules)
{
schedules.Add(new JobScheduleAPIModel(sched));
}
result.JobSchedules = schedules;
ICollection<SSISPackageSummaryAPIModel> packages = new Collection<SSISPackageSummaryAPIModel>();
foreach (SSISPackage pack in job.SSISPackages)
{
packages.Add(new SSISPackageSummaryAPIModel(pack));
}
result.SSISPackages = packages;
ICollection<ExecutionAPIModel> executions = await (from e in db.View_Executions
join p in db.SSISPackages on e.SSISPackageId equals p.SSISPackageId
join j in db.Jobs on p.JobId equals j.JobId
where p.JobId == job.JobId
orderby e.StartTime descending
select new ExecutionAPIModel
{
ExecutionId = e.ExecutionId,
PackageDisplayName = e.PackageDisplayName,
Status = e.Status,
StartTime = e.StartTime,
EndTime = e.EndTime,
Duration = e.Duration
}).Take(executionNumber).ToListAsync();
result.LatestExecutions = executions;
return result;
}
我来自 Web.Config 的连接字符串如下所示:
<add name="{name}" providerName="System.Data.SqlClient" connectionString="Data Source={serverName};Initial Catalog={dbName};Integrated Security=SSPI;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Encrypt=False;TrustServerCertificate=True" />
我在撰写问题时找到了答案,但我想我还是会分享它,以防其他人 运行 遇到类似问题。
问题出在我的连接字符串上。 Pooling=False
强制 Using
语句中的后续连接丢失凭据并恢复为匿名。
将连接字符串更改为 Pooling=True
可解决问题。