我编写了以下MVC控制器来测试取消功能:
class MyController : Controller
{
[HttpGet("api/CancelTest")]
async Task<IActionResult> Get()
{
await Task.Delay(1000);
CancellationToken token = HttpContext.RequestAborted;
bool cancelled = token.IsCancellationRequested;
logger.LogDebug(cancelled.ToString());
return Ok();
}
}
Run Code Online (Sandbox Code Playgroud)
说,我想取消请求,因此在上面的控制器操作中记录值' true '.如果服务器实现IHttpRequestLifetimeFeature,这可能是服务器端.幸运的是,Kestrel确实如此,这可以通过以下方式实现:
var feature = (IHttpRequestLifetimeFeature) HttpContext.Features[typeof(IHttpRequestLifetimeFeature)];
feature.Abort();
Run Code Online (Sandbox Code Playgroud)
但问题是我想在客户端取消请求.例如,在浏览器中.在ASP.NET MVC/WebApi的预核版本中,如果浏览器中止请求,则取消令牌将自动取消.示例:在Chrome中多次刷新页面.在chrome dev工具的"网络"选项卡中,您现在可以看到取消上一个(未完成的)请求.
问题是:在Kestrel上运行的ASP.NET Core中,我只能在日志中看到以下条目:
Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException:错误-4081 ECANCELED操作已取消
因此,来自浏览器的中止请求到达并由Kestrel网络服务器处理.但它不会影响控制器中HttpContext的RequestAborted属性,因为该方法仍会记录值' false '.
问题: 有没有办法中止/取消我的控制器方法,以便将HttpContext.RequestAborted属性标记为已取消?
也许我可以做一些订阅Kestrel的操作取消触发器并调用IHttpRequestLifetimeFeature.Abort()方法的东西?
更新: 我做了一些进一步的测试,看起来HttpRequest IS实际上已经中止,但在实际取消之前似乎有某种延迟.延迟不是时间因素,似乎直接来自libuv(Kestrel网络服务器构建在其上的库).我在https://github.com/aspnet/KestrelHttpServer/issues/1103上发布了更多信息
更多更新: 问题已移至另一个,因为前一个包含多个问题.https://github.com/aspnet/KestrelHttpServer/issues/1139
cancellation asp.net-core-mvc kestrel-http-server asp.net-core
在开发我们的应用程序一段时间后,我们已经积累了相当多的 EFCore 数据库迁移。由于 EFCore 为每次迁移添加了整个 db 模型的快照,因此这段代码加起来相当多。经过分析,我们大约 80% 的编译时间都花在了迁移上(编译 + Roslyn 分析器)。
所以是时候清理一些旧的迁移了!但最好的方法是什么?好像没有官方的指导...
我们不需要任何回滚(我们只向前滚),所以这让事情变得更简单。我们确实需要支持从头开始创建数据库,并从最近几次迁移中更新数据库。
我试过的:
核选项似乎是删除所有迁移和模型快照,并创建一个新的初始迁移。虽然这很好,但似乎有点危险。使用这种方法,我们需要非常小心,数据库模式的每个部分都是代码模型的一部分。例如,我们遇到的一种边缘情况是 EFCore 尚不支持检查约束。所以我们在迁移中添加了一个检查约束,而不是在代码模型中。因此,在创建新的初始迁移时,已检查的约束不是其中的一部分。
作为实验,我尝试从所有旧迁移中删除模型快照,因为快照是导致编译时间过长的代码的 90%。我发现,EFCore 仅使用快照作为比较工具来进行新的迁移。删除快照后,旧的迁移在新数据库上运行时不再执行。
那么有没有更好的方法来完成我想要的?
我在VS2015.1上使用.NET 4.6.1在VB.NET 14中编写了以下WPF示例应用程序:
Class MainWindow
Public Sub New()
InitializeComponent()
End Sub
Private Async Sub Button_Click(sender As Object, e As RoutedEventArgs)
MessageBox.Show("Pre")
Using window = New DisposableWindow()
window.Show()
For index = 1 To 1
Await Task.Delay(100)
Next
End Using
MessageBox.Show("Post")
End Sub
Class DisposableWindow
Inherits Window
Implements IDisposable
Public Sub Dispose() Implements IDisposable.Dispose
Me.Close()
MessageBox.Show("Disposed")
End Sub
End Class
End Class
Run Code Online (Sandbox Code Playgroud)
下面的示例生成以下输出:
这很奇怪.为什么Debug模式执行此代码的方式与Release模式不同?
当我将using块更改为手动try/finally块时,对window.Dispose()的调用甚至会抛出NullReferenceException:
Dim window = New DisposableWindow()
Try
window.Show()
For index = 1 To 1
Await Task.Delay(100) …Run Code Online (Sandbox Code Playgroud) 将我的应用程序从 ASP.NET Core 2.2 迁移到 ASP.NET Core 3.0 时,我遇到了以下问题:
我有一个在某些情况下应该记录错误消息的类。这是通过调用LogError上ILogger<MyClass>。
我曾经用我的单元测试中的以下片段来验证这一点:
Mock<ILogger<MyClass>> loggerMock = ...;
MyClass myClass = ...;
myClass.MethodThatLogsTestException();
loggerMock.Verify(l => l.Log(
It.IsAny<LogLevel>(),
It.IsAny<EventId>(),
It.IsAny<object>(),
It.IsAny<TestException>(),
It.IsAny<Func<object, Exception, string>>())
);
Run Code Online (Sandbox Code Playgroud)
现在问题来了:
在 ASP.NET Core 2.2 中,第三个参数(Mocked via It.IsAny<object>())是内部类型FormattedLogValues。这是一堂课,所以It.IsAny<object>()奏效了。在 ASP.NET Core 3.0 中,它已更改为结构体,因此It.IsAny<object>()不再匹配它。
如何让我的Verify()电话在 ASP.NET Core 3.0 中工作?是否有It.IsAny()匹配任何结构类型的版本?
编辑:这是一个完全可运行的代码段,它在 ASP.NET Core 3.0 上失败并在 ASP.NET Core 2.2 上成功。
public class Test
{
public class Impl
{ …Run Code Online (Sandbox Code Playgroud) 我在开发在 .NET Framework 4.6.2 上运行的 ASP.NET Core MVC 2 应用程序时使用 Visual Studio 2017 (15.4.1)。
我试图让 Visual Studio 中断通过我的代码的所有未处理的异常。如何让 Visual Studio 中断从我的代码调用的外部库中引发的未处理异常?
这些是我的设置:
请参阅以下代码片段:
void ThrowExceptionInUserCode()
{
// Exception helper doesn't pop up, and shouldn't.
try { throw new Exception(); }
catch (Exception) { }
// Exception helper pops up, and should.
throw new Exception();
}
void ThrowExceptionInExternalLibrary()
{
// Exception helper doesn't pop up, and shouldn't.
try { PopularLibrary.MethodThatFails(); …Run Code Online (Sandbox Code Playgroud) 默认情况下,实体框架核心将所有已执行的SQL查询记录到ASP.NET Core记录器(Microsoft.Extensions.Logging)中。默认的日志级别是“信息性”,但对于信息性日志记录来说,我似乎有点不高兴。我更喜欢在Debug甚至Trace级别。
有什么方法可以配置EFCore在调试(或跟踪)级别而不是信息级别记录这些SQL查询?
与helm inspect [CHART]我可以查看的内容chart.yaml和values.yaml图表的.有没有办法查看图表的模板文件?最好通过Helm命令.
旁注:这对我来说似乎是一个非常重要的特征.在安装之前,我总是想知道图表的确切功能.或者这不是helm inspect用于什么?可能推荐的方法是简单地检查GitHub以获取图表的工作原理吗?
假设我有一个我想用scoped生命周期来解决的服务.但有时我尝试将其解析为接口类型,有时在实现类型.
我试图做的第一件事是:
ServiceCollection services;
services.AddScoped<MyClass>();
services.AddScoped<IMyInterface, MyClass>();
Run Code Online (Sandbox Code Playgroud)
上面的示例的问题是,如果我解析IMyInterface,则使用不同的实例,而不是解析MyClass.基本上,两个范围的实例可能同时存在.
我通过以下方式解决此问题.但它很容易出错,因为你很容易忘记在一个地方做这件事,而且很难注意到.
serviceCollection.AddScoped<MyClass>();
serviceCollection.AddScoped<IMyInterface, MyClass>(sp => sp.GetRequiredService<MyClass>());
Run Code Online (Sandbox Code Playgroud)
有没有办法以一种不易出错的方式完成我想要的东西.优先,但不一定,在一次注册?
即作为xUnit测试:
public class Tests
{
[Fact]
public void ReturnsSameInstanceForImplementationAndServiceType()
{
var serviceCollection = new ServiceCollection();
// TODO: Change these lines so they're less error prone.
serviceCollection.AddScoped<MyClass>();
serviceCollection.AddScoped<IMyInterface, MyClass>(sp => sp.GetRequiredService<MyClass>());
var services = serviceCollection.BuildServiceProvider();
var myInt = services.GetRequiredService<IMyInterface>();
var myCls = services.GetRequiredService<MyClass>();
Assert.Equal(myCls, myInt);
}
class MyClass : IMyInterface { }
interface IMyInterface { }
}
Run Code Online (Sandbox Code Playgroud) 可以go get -u更新使用 go.mod 的 Go 应用程序中的所有包。然而,Go 中有一个约定,当发生重大更改时,包名称会更新为主要版本。
例如,在进行重大更改更新后,“github.com/ahmetb/go-linq”在“github.com/ahmetb/go-linq/v2”中发生了变化。
如何检测我使用的任何软件包是否更新了其主要版本?
asp.net-core ×4
c# ×3
.net ×1
.net-core ×1
async-await ×1
cancellation ×1
exception ×1
go ×1
kubernetes ×1
moq ×1
vb.net ×1