前言
下面雜亂的記錄了一些在實際開發中碰到一些浪費時間的“坑”,寫給前行者。
格式有些亂,見諒。
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 的框架類庫。