.NET 6 攻略大全(三)( 七 )


此更改增加了对 Socks4、Socks4a 和 Socks5 的支持 。 例如 , 它可以通过 SSH 测试外部连接或连接到 Tor 网络 。
该类WebProxy现在接受socks方案 , 如以下示例所示 。

var handler = new HttpClientHandler{Proxy = new WebProxy("socks5://127.0.0.1", 9050)};var httpClient = new HttpClient(handler);归功于 Huo yaoyuan 。
▌Microsoft.Extensions.Hosting — 配置主机选项 API
我们在 IHostBuilder 上添加了一个新的 ConfigureHostOptions API , 以简化应用程序设置(例如 , 配置关闭超时):
using HostBuilder host = new.ConfigureHostOptions(o =>{o.ShutdownTimeout = TimeSpan.FromMinutes(10);}).Build;host.Run;
在 .NET 5 中 , 配置主机选项有点复杂:
using HostBuilder host = new.ConfigureServices(services =>{services.Configure<HostOptions>(o =>{o.ShutdownTimeout = TimeSpan.FromMinutes(10);});}).Build;host.Run;
▌Microsoft.Extensions.DependencyInjection — CreateAsyncScope API
CreateAsyncScope 创建API是为了处理服务的处置 IAsyncDisposable 。 以前 , 您可能已经注意到处置 IAsyncDisposable 服务提供者可能会引发 InvalidOperationException 异常 。
以下示例演示了新模式 , CreateAsyncScope 用于启用 using 语句的安全使用 。
await using (var scope = provider.CreateAsyncScope){var foo = scope.ServiceProvider.GetRequiredService<Foo>;}以下示例演示了现有的问题案例:
using System;using System.Threading.Tasks;using Microsoft.Extensions.DependencyInjection;await using var provider = new ServiceCollection.AddScoped<Foo>.BuildServiceProvider;
// This using can throw InvalidOperationExceptionusing (var scope = provider.CreateScope){var foo = scope.ServiceProvider.GetRequiredService<Foo>;}
class Foo : IAsyncDisposable{public ValueTask DisposeAsync => default;}
以下模式是先前建议的避免异常的解决方法 。 不再需要它 。
var scope = provider.CreateScope;var foo = scope.ServiceProvider.GetRequiredService<Foo>;await ((IAsyncDisposable)scope).DisposeAsync;感谢 Martin Bj?rkstr?m。
▌Microsoft.Extensions.Logging — 编译时源生成器
.NET 6引入了LoggerMessageAttribute类型. 此属性是Microsoft.Extensions.Logging 命名空间的一部分 , 使用时 , 它会源生成高性能日志记录 API 。 源生成日志支持旨在为现代 .NET 应用程序提供高度可用和高性能的日志解决方案 。 自动生成的源代码依赖于 ILogger 接口和 LoggerMessage.Define功能 。
LoggerMessageAttribute 源生成器在用于 partial 日志记录方法时触发 。 当被触发时 , 它要么能够自动生成 partial 它正在装饰的方法的实现 , 要么生成编译时诊断 , 并提供有关正确使用的提示 。 编译时日志记录解决方案在运行时通常比现有的日志记录方法快得多 。 它通过最大限度地消除装箱、临时分配和副本来实现这一点 。
与直接手动使用 LoggerMessage.Define API 相比 , 有以下好处:
  • 更短更简单的语法:声明性属性使用而不是编码样板 。
  • 引导式开发人员体验:生成器发出警告以帮助开发人员做正确的事情 。
  • 支持任意数量的日志记录参数 。 LoggerMessage.Define 最多支持六个 。
  • 支持动态日志级别 。 这是 LoggerMessage.Define 单独不可能的 。
要使用 LoggerMessageAttribute , 消费类和方法需要是 partial 。 代码生成器在编译时触发并生成 partial 方法的实现 。

特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。