Skip to content

Latest commit

 

History

History
268 lines (193 loc) · 9.73 KB

episode-032.md

File metadata and controls

268 lines (193 loc) · 9.73 KB

.NET 每周分享第 32 期

卷首语

为什么选择 .NET

image

最近 .NET 团队发布了一篇文章,介绍了自从 .NET 开源以来,微软和社区为 .NET 的发展和壮大做出的各种努力和付出。这也是为什么我们要选择 .NET 的原因。

行业资讯

1、.NET 语言更新策略

image

.NET 平台上有三种编程语言可以运行,分别是 C#F#Visual Basic 三种语言,那么微软官方对三种语言的支持承若是怎样的呢?

  • C# 是广泛使用的编程语言:1)广泛和积极的创新;2)保持这门语言的内在精神;3)服务于最广大的开发者;4)最大程度保证兼容;5)保持支持。
  • F# 用来探索函数式语言的可能性:1)保持语言的统治性和前瞻能力;2)依赖社区提供重要的库,开发工具和工作场景;3)支持 .NET 平台的其他更新和保持互操作性;4)保持低入门槛。
  • VB 是兼容已经存在的代码:1)保持一个直接和可操作的编程语言;2)稳定的设计;3)保持可接受的方法和语法;4)持续提高 VS 中的体验;5)所有工作都在 VB 核心中。

文章推荐

1、组织你的 .NET 项目

如果你作为一个创业公司的 CTO,需要为自己的产品和服务开发一套服务,你会又很多问题需要考虑

代码方面

  • 单个解决方案
  • 拆分多个项目

部署方面

  • 一次部署
  • 使用负债均衡器部署多个服务
  • 特定请求发送给特定的服务器
  • 微服务部署

通信

  • 内存消息通信
  • API 请求通信
  • 消息队列

数据库

  • 单个数据库
  • 多个数据库
  • 数据库分片

这些选择都是基于业务的需求不停的演变,这篇文章介绍为什么需要选择这个措施,有哪些 Trade-off, 以及具体的例子。

2、EventSource 学习

Event Source 是广泛使用的持久化状态的工具, Marten.NET 平台使用的的 Event 库,Jermery Miller 也是 Marten 是维护者。

3、C# Web 安全开发建议

image

我们都知道 Web 是不安全的,那么作为 .NET Web 开发工程师,需要在服务端做好这些防护工作。

  1. X-XSS-Protection Header

跨站脚本攻击是一件常见的的攻击手段,它可以通过在用户页面自动执行一些脚本就可以达到攻击的页面. HTTP Header 中的 X-XSS-Proection 可以阻止脚本执行

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        context.Response.Header.Add("Content-Security-Policy", "default-src 'self';");
        await next();
    });
    app.UseMvc();
}
  1. Content-Security-Policy Header CSP 允许你那些资源可以在浏览器中执行
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        Context.Response.Header.Add("Content-Security-Policy", "default 'self';");
        await next ();
    });
}
  1. X-Frame-Options Headers

攻击者可以通过 ClickJacking 方式对 UI 进行重绘,这样可以误导用户错误点击,X-Frame-Options Header 可以限制这样的行为。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        context.Response.Header.Add("X-Frame-Options", "DENY");
        await next();
    })
}
  1. HSTS 我们都知道 HTTP 协议不安全,应该选择 HTTPS 版本,但是仍然有办法绕过 HTTPS 而是直接使用 HTTPHSTS 可以强制使用 HTTPS 协议。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   app.UseHsts();
}

4、Powershell 入门系列教程

image

这是一个 Powershell 学习资源的 twitter thread, 主要包含一下内容

5、C# 异步编程模式

image

C# 的历史发展过程中,异步编程经历过三种模式,分别为

  • 异步编程模式 (Asynchronous Programming Model, APM)
  • 基于事件的异步模式 (Event-Based Asynchronous Pattern, EAP)
  • 基于任务的异步模式 (Task-Based Asynchrouous Pattern, TAP)
  1. APM 包含三种主要成分
  • 两个方法分别表示开始和结束的异步操作
  • 一个 AsyncCallback 的委托,用来表示操作的完成
  • 可选的 state 属性表示依赖
public class ApmFileReader
{
    private byte[]? _buffer;
    private const int InputReportLength = 1024;
    private FileStream? _fileStream;

    public void BeginReadAsync()
    {
        _buffer = new byte[InputReportLength];
        _fileStream = File.OpenRead("User.txt");
        _fileStream.BeginRead(_buffer, 0, InputReportLength, ReadCallbackAsync, _buffer);
    }

    public void ReadCallbackAsync(IAsyncResult iResult)
    {
        _fileStream?.EndRead(iResult);
        var buffer = iResult.AsyncState as byte[];
    }
}
  1. EAP 使用 C# 的事件是实现异步操作,这些操作在各自的线程上操作,然后通过异步来通知。
public void GetUserAsync(int userId, object userState)
{
    AsyncOperation operation = AsyncOperationManager.CreateOperation(userState);

    ThreadPool.QueueUserWorkItem(state =>
    {
        GetUserCompletedEventArgs args;
        try
        {
            var user = GetUser(userId);
            args = new GetUserCompletedEventArgs(null, false, user);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            args = new GetUserCompletedEventArgs(e, false, null);
        }

        operation.PostOperationCompleted(_operationFinished, args);

    }, userState);
}
  1. TAP

这是目前 C# 推荐的异步编程模型,通过 Task, asyncawait 关键字实现异步功能。

public Task<int> OperationName1Async(int param)
{
    // more code
    return Task.FromResult(1);
}

public async Task<int> OperationName2Async(int param)
{
    // more code with await
    return 1;
}

6、C# 中 String 的优化机制

String 类型在 C# 中是一种不可变的引用类型,但是有一个特性往往被大家忽略了,也就是 Intern 功能。简单来说就是 CLR 会将明面字符串在内存中储存一起来,如果有相同的变量使用同一个字符串,那么就会共享这一个内存空间。

var dotnetweekly1 = ".net weekly";
var dotnetweekly2 = ".net weekly";

Console.WriteLine(dotnetweekly1 == dotnetweekly2); //true
Console.WriteLine(object.ReferenceEquals(dotnetweekly1, dotnetweekly2)); //true

string dotnet = ".net";
string weekly = " weekly";
string dotnetweekly = dotnet + weekly;
Console.WriteLine(".net weekly" == dotnetweekly); //true
Console.WriteLine(object.ReferenceEquals(".net weekly", dotnetweekly));// false;

const string dotnet3 = ".net";
const string weekly3 = " weekly";
string dotnetweekly3 = dotnet3 + weekly3;
Console.WriteLine(".net weekly" == dotnetweekly3); //true
Console.WriteLine(object.ReferenceEquals(".net weekly", dotnetweekly3));// true;

7、Anders Hejlsberg 专访

播客博主采访了 Anders Hejlsberg,讨论了下面的内容:

  • Anders 早期的经历,包括电脑,编程语言和病毒
  • Turbo Pascal 的经历
  • 早期开发 C#.NET Framework 经历
  • Typescript 的现状
  • 关于其他语言的看法,比如 Rust, Golang 等等。

开源项目

1、stride

image

Stride 是最近 C# 开源的游戏引擎库。

2、CommunityToolkit

CommunityToolkit` 是微软官方维护的一组工具类集合, 主要包含下面四种类型

  • CommunityToolkit.Common 共有类集合
  • CommunityToolkit.Mvvm MVVM 设计模式需要的类库
  • CommunityToolkit.Diagnoscitcs 参数任何和错误检查的工具库
  • CommunityToolkit.HighPerformance 高性能的 API 和类型库