我有一个无法同时执行的存储过程。多个进程调用此存储过程,但进程顺序访问存储过程至关重要。
该存储过程基本上扫描表中满足各种条件的主键,将记录标记为调用进程正在使用,然后将主键传递回调用进程。
任何地方都可能存在一到十几个调用进程的实例,具体取决于存在的工作量。
sp_GetAppLock我决定通过在存储过程内部使用来防止并发。我获取了一个独占事务锁,并将@Resource其设置为仅在该存储过程中使用的字符串。唯一被该锁阻止的是该存储过程的执行。
存储过程内部的调用如下所示:
sp_getapplock @Resource='My Unique String Here'
,@LockMode='Exclusive' -- Type of lock
,@LockOwner='Transaction' -- Transaction or Session
,@LockTimeout = 5000
Run Code Online (Sandbox Code Playgroud)
它运作顺利。如果我的进程有十几个实例正在运行,那么在任一时间点只有其中一个实例执行存储过程,而另外 11 个实例则乖乖地排队等候。
唯一的问题是我们的DBA。他是一位非常优秀的DBA,不断监视数据库是否阻塞,并在超过某个阈值时收到警报。我的使用sp_getapplock触发了很多警报。我的 DBA 声称阻塞本身就是一个性能问题。
他的说法准确吗?我的感觉是,这是“好的”阻塞,因为唯一被阻塞的是存储过程的执行,我希望它被阻塞。但我的 DBA 说,强制 SQL Server 强制执行此阻止会严重消耗资源。
我可以告诉他“放下破裂的管子”,就像我们过去常说的那样吗?或者我应该重写我的应用程序以避免需要sp_getapplock?
我读到的让我感兴趣的文章sp_getapplock在这里:sp_getapplock
在 .Net Core 2.2 中使用实体框架,我想将 EF 生成的所有 SQL 语句记录到 Visual Studio 中的调试输出窗口。
在 .Net Framework 中,我只需将此行添加到 DbContext 构造函数中:
Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
Run Code Online (Sandbox Code Playgroud)
在 EF 中,我正在尝试以下操作。它编译,并且 OnConfiguring 方法确实被调用,但没有数据库调用记录到我的调试输出窗口。我错过了什么?
public class MyContext : DbContext
{
private ILoggerFactory GetLoggerFactory()
{
IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder => builder
.AddDebug()
.AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Debug));
return serviceCollection.BuildServiceProvider()
.GetService<ILoggerFactory>();
}
public MyContext(DbContextOptions<MembershipContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLoggerFactory(GetLoggerFactory());
}
}
Run Code Online (Sandbox Code Playgroud)
我的 appsettings.json 包含这个:
"Logging": {
"LogLevel": {
"Default": "Debug"
}
Run Code Online (Sandbox Code Playgroud)
}, …
我有一个 asp.net core (.Net 5) Razor Pages 应用程序。在我的模型中,我有一个装饰如下的属性:
[Display(Name = "Borrower Name", Prompt = "Borrower Name", Description = "Restrict the search results by borrower name.")]
[StringLength(255)]
public string BorrowerName { get; set; }
Run Code Online (Sandbox Code Playgroud)
我希望上面设置的“描述”属性呈现为输入的标题(也称为工具提示)。这是我渲染它的方式。它正确呈现,并且占位符已正确设置为提示(“借款人姓名”),但我的描述未呈现为“标题”属性。我缺少什么?
<label asp-for="BorrowerName" class="form-label"></label>
<input asp-for="BorrowerName" class="form-control" />
Run Code Online (Sandbox Code Playgroud)
这是渲染的内容:
<input class="form-control" type="text" data-val="true" data-val-length="The field Borrower Name must be a string with a maximum length of 255." data-val-length-max="255" id="BorrowerName" maxlength="255" name="BorrowerName" placeholder="Borrower Name" value="">
Run Code Online (Sandbox Code Playgroud)
文档(https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.displayattribute.description?view=net-5.0)说“Description属性通常用作工具提示或描述UI 元素”,但没有提供如何实现这一点的线索。
我正在尝试在本地计算机上运行Visual Studio 2013 Web测试.这是我成功运行的测试(大约2个月前的最后一次).Web测试的第一步是对登录页面的GET请求.它看起来像这样:
获取https://example.com/Login.aspx
当我在网络浏览器中输入此网址时,它会成功.此外,我可以成功记录Web测试,我只是导航到此页面并登录.但是当我尝试重新运行我刚刚记录的webtest时,我得到了对GET请求的响应:
Request failed: An existing connection was forcibly closed by the remote host
Run Code Online (Sandbox Code Playgroud)
在example.com上IIS没有记录任何内容(IIS不记录GET请求).但是,当我手动登录或者记录Web测试时,IIS会正确记录GET请求.
在example.com或我的本地主机上的事件查看器中没有记录消息.
任何有关如何调试此问题的建议都非常感谢.
这不是完全重复;下面提供的答案与建议的重复答案中的评论相同。
从 asp.net 控制器操作内部,我很想知道该调用是否是由 javascript fetch() 调用进行的。我可以询问 Request 对象的任何部分以发现这一点吗?
例如,如果我想知道调用者是否是 javascript $.ajax 调用,在服务器端我可以调用这个方法:
Request.IsAjaxRequest();
Run Code Online (Sandbox Code Playgroud)
如果它返回 true 我知道调用是这样的:
$.ajax({
url: '/MyDomain/MyControllerAction',
type: 'GET',
success: function (data) {
doSomething(data);
},
error: function (XMLHttpRequest, ajaxOptions, ex) {
doSomethingElse(XMLHttpRequest, ajaxOptions, ex);
});
Run Code Online (Sandbox Code Playgroud)
是否有类似 Request.IsAjaxRequest() 我可以调用或询问来发现调用者是否是 javascript fetch(),例如这样的调用:
fetch('/MyDomain/MyControllerAction')
.then(function (data) {
if(data.ok){
return data.json();
}
})
.then(function (data) {
doSomething(data)
})
.catch(function (error) {
doSomethingElseAgain(error);
});
Run Code Online (Sandbox Code Playgroud) 当我尝试构建 IdentityServer4 时,我收到错误消息“以代码 -532462766 退出”。该错误似乎发生在“MinVer”Nuget 包内。
我从https://github.com/IdentityServer/IdentityServer4的 github 站点将 IdentityServer4 zip 文件下载到 Windows 10 机器上,并将其解压缩到本地目录中,然后按照以下说明进行操作:
下载最新的 .Net Core SDK。我已经安装了最新的 sdk,但是在“MinVer”nuget 包(见下文)中出现错误后,我决定也下载几个旧版本。我的 C:\Program Files\dotnet 文件夹在“sdk”文件夹中包含以下子文件夹:
在根目录中运行 build.ps1。Build.ps1 执行 nuget 恢复,然后执行其他 5 个构建文件,内容如下:
Run Code Online (Sandbox Code Playgroud)$ErrorActionPreference = "Stop"; New-Item -ItemType Directory -Force -Path ./nuget dotnet tool restore pushd ./src/Storage ./build.ps1 $args popd pushd ./src/IdentityServer4 ./build.ps1 $args popd pushd ./src/EntityFramework.Storage ./build.ps1 $args popd pushd ./src/EntityFramework ./build.ps1 $args popd pushd ./src/AspNetIdentity ./build.ps1 $args popd
当我运行 build.ps1 时,我看到“dotnet tool …
这是一个使用 Serilog.Sinks.Email 2.4.0 的 .Net Core 6 控制台应用程序。在同一个项目中,我引用了 MailKit 3.1.0 Nuget 包。我注意到 Serilog.Sinks.Email 还引用了 Mailkit 3.1.0。
我正在像这样配置记录器。我的目标是让 Serilog 在调用 Log.Fatal() 时发送电子邮件:
.WriteTo.Email(
new EmailConnectionInfo()
{
FromEmail = _appSettings.EmailFrom,
ToEmail = _appSettings.EmailToOnError,
MailServer = _appSettings.EmailHost,
EmailSubject = $"Runtime error starting {_appSettings.ApplicationName}",
ServerCertificateValidationCallback = (s, c, h, e) => true
},
restrictedToMinimumLevel: LogEventLevel.Fatal);
Run Code Online (Sandbox Code Playgroud)
我将 Serilog 消息记录到调试输出窗口,如下所示,这样我就可以看到 Serilog 本来(按设计)吞咽的错误消息:
Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
Run Code Online (Sandbox Code Playgroud)
当我调用 Log.Fatal(),然后立即调用 Log.CloseAndFlush(),并查看“调试输出”窗口时,我可以看到 Serilog 尝试向我发送电子邮件,但失败了,说它找不到 MailKit 方法.MailTransport.SendAsync()。知道我缺少什么吗?以下是调试输出窗口中的完整错误消息:
Exception while emitting periodic batch from
Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink: System.MissingMethodException:
Method not found: 'System.Threading.Tasks.Task
MailKit.MailTransport.SendAsync(MimeKit.MimeMessage, System.Threading.CancellationToken, …Run Code Online (Sandbox Code Playgroud) c# ×3
.net-core ×2
.net-6.0 ×1
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
fetch-api ×1
iis ×1
javascript ×1
load-testing ×1
locking ×1
mailkit ×1
minver ×1
nuget ×1
razor-pages ×1
serilog ×1
sql-server ×1