asp.net core 碰到的一些坑

作者: 白玉昭 | 来源:发表于2017-08-17 15:43 被阅读133次

    前言


    下面杂乱的记录了一些在实际开发中碰到一些浪费时间的“坑”,写给前行者。

    格式有些乱,见谅。

    1,HttpContext.Response.RegisterForDispose 事件

    2,IApplicationLifetime.ApplicationStopping.Register(OnShutdown,toDispose);

    3,在 .net core 2.0 preview2 中,会自动读取appsettings.json到IConfiguration中去

    4,在Library中,添加的资源文件设置如下:右键资源文件,选择属性,Build Action 中选择Embedded Resource即可。 然后使用Assembly.GetManifestResourceNames 和 GetManifestResourceStream 即可读取

    5,小心==重载造成的死循环

    6,Linq中的Select引用Trick,Select出来的依然是引用

    List list = new List();

    list.Add(new Entity() { Name = "One" });

    IEnumerable list2 = list.Select(t => t.Name);

    Console.WriteLine(list2.ElementAt(0));

    list.ElementAt(0).Name = "Two";

    Console.WriteLine(list2.ElementAt(0));

    结果:第一行One,第二行Two。 select出的值依然是引用类型

    在第三行list.Select(t => t.Name)后加上.ToArray(),可以避免这个情况 发生。

    7,在MySql.Data 7.0.7-m61中,DbDataReader.Close()与DbDataReader.Dispose()不能真正关闭reader;IDataReader.Close()不起作用,但IDataReader.Dispose()起作用。解决办法,将其转换为MySqlDataReader,然后close。

    //最新,在8.0.8-dmr版本中,会起作用。

    8, 鼓励直接引用,比如ProjectA,使用到ProjectB与ProjectC,而ProjectB使用到ProjectC,那么在vs里,ProjectA直接引用ProjectB即可。但是鼓励也添加直接引用ProjectC。 事实上,在vs for mac中,不直接引用会导致intelligence失灵。2017-7-1

    9, Visual studio 2017 Preview 2. 新建web项目,nuget bad request 400 错误。改语言为English。解决。 2017-6-19

    10,asp.net core Authentication模块重构。原来Http.Feature和Http.Abstractions中的Authentication文件夹中的代码全部弃之不用。 转而集中到 Authentication.Abstractions中。完成了Http 与 Authentication的解耦。 2017-6-21

    11,在json配置文件中,若属性为数字型,不可为空(""),会引发异常导致读不了,

    12,使用serviceCollection.Configure, 一定要 serviceCollection.AddOptions()

    13, 构造函数中使用到httpcontext,session等,一定要AddScope,而不是AddSigleton

    14,有时候莫名其妙的话,特别是reference出问题的话,重启visual studio 2017.  2017-7-1

    15,visual studio 2017 preview 4 总是需要rebuild,否则引用类库里的修改,不会体现

    16,JwtBearerEvents 中的OnAuthenticationFailed 设置 StatusCode得到Kestrell抛出StatusCode cannot be set because the response has already started 异常。这也是因为 [Authority] 属性会调用Challenge,那里会设置statuscode,和 error head。 所以从返回的header中读取错误信息即可。OnAuthenticationFailed应该永远不使用。

    17, IIS 配置时,权限要加上IIS_IUSRS Modify权限。

    18, IIS外网无法访问时,检查如下:

    1,访问权限。

    2,防火墙,或者云计算机的控制台里的防火墙

    3,netsh http show iplisten 查看是否有监听 ip地址,没有的话,使用netsh http add iplisten ipaddress=111.xxxx 来添加监听,这样请求才能到达iis

    19,关于DataProtection的问题。部署在单机IIS上,可以按照文档进行即可。但如果要在多个IIS之间共享DataProtection(实际场景),则要如下。首先建立共享文件夹,用于存放DataProtection加密后的文件。然后,要指定key,如果不指定,则每次更换。key用Certification来指定。最后,指定ApplicationDataProtectionDiscriminator为同一个。代码如下:

    services.AddDataProtection()

        .SetApplicationName("xxxx.yyyyy.zzz")

        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share")

        .ProtectKeysWithCertificate("cert_thumbprint");

    这三个配置将逻辑、物理位置、key三者设置相同,即可在IIS之间共享cookie等等加密后需要解密的。

    ProtectKeysWithCertificate本机没问题,服务器上一直报错。解决办法,将证书存储在Root下,然后右键复制,再到MY下,粘贴。这样可能是能解决某个权限问题。

    欢迎来访本人的github上项目:https://github.com/yzbai/HB.Framework,一个辅助最新asp.net core 2 的框架类库。

    相关文章

      本文标题:asp.net core 碰到的一些坑

      本文链接:https://www.haomeiwen.com/subject/ijfnrxtx.html