【发布时间】:2020-05-21 06:19:06
【问题描述】:
我有一个奇怪的行为。当我尝试通过 EF Core 2.2 执行 SQL 存储过程时。我得到一个超时(30秒)。但是,当我在 SQL Server Management Studio 中执行相同的过程时,它会成功运行 - 运行大约 1 或 2 秒。
更新:这个问题发生在大约 2 个月前。在此之前,该服务能够运行此过程。
这是我使用的DbContext:
public class MyContext : DbContext
{
public MyContext(string connectionString)
: base(new DbContextOptionsBuilder().UseSqlServer(connectionString).Options)
{
}
// some DbSets omitted here ...
public async Task<string> ProcExecuteAsync(string login, string xml)
{
// get some data from db (omitted)
var xmlParameter = new SqlParameter("@XML", SqlDbType.Xml) { Value = xml };
var xmlOutputParameter = new SqlParameter("@XMLoutput", SqlDbType.Xml) { Direction = ParameterDirection.Output };
await Database.ExecuteSqlCommandAsync(
"MyProc_set @idUser=@idUser,@XML=@XML,@XMLoutput=@XMLoutput OUT",
new SqlParameter[] { userIdParameter, xmlParameter, xmlOutputParameter });
return (string)xmlOutputParameter.Value;
}
}
然后我有一个处理程序(我使用Mediator 库):
public class AddToClientCommandHandler : IRequestHandler<AddToClientCommand, AddToClientResponse>
{
private readonly IContextBuilder _contextBuilder;
public AddToClientCommandHandler(IContextBuilder contextBuilder)
{
_contextBuilder = contextBuilder;
}
public async Task<AddToClientResponse> Handle(AddToClientCommand command, CancellationToken cancellationToken)
{
using (var context = _contextBuilder.CreateMyContext())
{
// getting some data from db (omitted)
// generate xmlRequest (omitted)
var result = await context.ProcExecuteAsync(command.Login, xmlRequest);
return new AddToClientResponse(result);
}
}
}
这是ContextBuilder:
public class ContextBuilder : IContextBuilder
{
private readonly IOptions<ConnectionStrings> _connectionStrings;
public ContextBuilder(IOptions<ConnectionStrings> connectionStrings)
{
_connectionStrings = connectionStrings;
}
public MyContext CreateMyContext()
{
var result = new MyContext(_connectionStrings.Value.Entities);
return result;
}
}
我是这样注册的:
public static class ApplicationContextBuilderExtension
{
public static void AddApplicationContextBuilder(this IServiceCollection services)
{
services.AddSingleton<IContextBuilder, ContextBuilder>();
}
}
有没有可能是我注册ContextBuilder时使用了AddSingleton造成的问题?
谁能告诉我如何以及在哪里调查问题?
【问题讨论】:
-
您的处理程序正在调用
CreateLMContext,但您的构建器有CreateMyContext。这只是示例代码中的错字/错误吗? -
是的,这是一个错字。谢谢,我编辑了。
-
您能否检查(从异常堆栈跟踪或 EF Core 日志记录)异常是由 db 连接打开触发还是由 db 命令执行触发的?
-
@Ivan,看起来异常是由 db 命令执行触发的:“ClassName”:“System.Data.SqlClient.SqlException”,“Message”:“Timeout expired。超时时间已过之前操作完成或服务器没有响应。",
标签: c# sql-server asp.net-core stored-procedures ef-core-2.2