小编Tom*_*gan的帖子

sp_getapplock 是否会导致 SQL Server 性能问题?

我有一个无法同时执行的存储过程。多个进程调用此存储过程,但进程顺序访问存储过程至关重要。

该存储过程基本上扫描表中满足各种条件的主键,将记录标记为调用进程正在使用,然后将主键传递回调用进程。

任何地方都可能存在一到十几个调用进程的实例,具体取决于存在的工作量。

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

sql-server stored-procedures locking

4
推荐指数
1
解决办法
4383
查看次数

记录实体框架 .Net Core 2.2 EF 以调试输出窗口

在 .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)

}, …

c# entity-framework .net-core

4
推荐指数
2
解决办法
5622
查看次数

asp.net core Razor Pages:希望 DisplayAttribute 描述显示为标题/工具提示

我有一个 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 元素”,但没有提供如何实现这一点的线索。

data-annotations asp.net-core razor-pages

3
推荐指数
1
解决办法
1463
查看次数

Visual Studio 2013 WebTest请求失败:远程主机强制关闭现有连接

我正在尝试在本地计算机上运行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 iis load-testing visual-studio-2013

2
推荐指数
1
解决办法
2581
查看次数

从服务器,如何识别 javascript fetch() 调用(asp.net mvc)

这不是完全重复;下面提供的答案与建议的重复答案中的评论相同。

从 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)

javascript asp.net-mvc fetch-api

2
推荐指数
1
解决办法
1151
查看次数

无法在 Windows 10 机器上构建 IdentityServer4

当我尝试构建 IdentityServer4 时,我收到错误消息“以代码 -532462766 退出”。该错误似乎发生在“MinVer”Nuget 包内。

我从https://github.com/IdentityServer/IdentityServer4的 github 站点将 IdentityServer4 zip 文件下载到 Windows 10 机器上,并将其解压缩到本地目录中,然后按照以下说明进行操作:

  1. 下载最新的 .Net Core SDK。我已经安装了最新的 sdk,但是在“MinVer”nuget 包(见下文)中出现错误后,我决定也下载几个旧版本。我的 C:\Program Files\dotnet 文件夹在“sdk”文件夹中包含以下子文件夹:

    • 2.1.202
    • 2.1.803
    • 2.2.108
    • 3.0.101
    • 3.1.100
    • 3.1.101
  2. 在根目录中运行 build.ps1。Build.ps1 执行 nuget 恢复,然后执行其他 5 个构建文件,内容如下:

$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
Run Code Online (Sandbox Code Playgroud)

当我运行 build.ps1 时,我看到“dotnet tool …

c# nuget identityserver4 minver

2
推荐指数
1
解决办法
473
查看次数

Serilog WriteTo.Email() 失败

这是一个使用 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# serilog mailkit .net-core .net-6.0

2
推荐指数
1
解决办法
1898
查看次数