最近.NET Core升級到2.0後開始慢慢搗鼓的多了起來,但遇到了不少坑,所以特來記錄下。 第一個坑 條件編譯符 我們在編寫一些方法的時候通常會為Debug模式增加一些輸出日誌等以便我們檢查,也會為Release模式增加或修改一些特定的參數,但今天我在寫這些的時候就遇到了這個坑#if !DEBUG ...
最近.NET Core升級到2.0後開始慢慢搗鼓的多了起來,但遇到了不少坑,所以特來記錄下。
第一個坑 條件編譯符
我們在編寫一些方法的時候通常會為Debug模式增加一些輸出日誌等以便我們檢查,也會為Release模式增加或修改一些特定的參數,但今天我在寫這些的時候就遇到了這個坑
#if !DEBUG #endif 中間的代碼 不能我怎麼更改配置環境 始終是灰色,這讓我開始懷疑,難道VS 2017 的.NET Core 不支持條件編譯符了?
於是新建了個控制台程式測試了以下,但又發現還是起作用了的如下:
這裡就可以 看到 我明明不是Debug環境啊,可是 #if DEBUG的還是正常色,!DEBUG的還是灰色,直接F5運行後 發現結果出乎我意外
結果居然是正常的,如何我又懷疑是我vs 更新後出問題了,於是我又用.net framework 舊格式創建一個了一個項目發現舊的又是好的
第二個坑 .NET Core MVC下的部分文件無法下載
使用.NET Core MVC創建了一個站點,本來使用的還蠻好的,但後來配備了app 於是就直接把apk 文件放到 網站的wwwroot目錄下了,改了個名字就叫app.apk,然後訪問: http://127.0.0.1/app.apk 返回給我一個404 not find
因為搞iis 還是比較多,於是馬上想到一個是每天添加 mime導致,於是去iis站點裡面增加,發現以及存在了
瞬間就懵逼了,於是就從到請求篩選裡面去找找是不是在那被禁止了 但發現也沒用,於是又把文件改成app.apk.zip試了下,發現zip是可以下載的
------------
21號中午更新,
這個問題感謝@蝸牛往前走的指點,所以才記起因為iis只是一個代理了,所以自己搗鼓了一個解決方案,就是在appsettings.json配置裡面配置
如下
在到設置Startup.cs的添加代碼
public void ConfigureServices(IServiceCollection services) { services.Configure<Dictionary<string,string>>(Configuration.GetSection("Mime")); services.AddMvc(); services.AddDbContext<ApplicationDataContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection"))); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions<Dictionary<string, string>> option) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } // app.UseStaticFiles() //使用新的配置文件方式使用 var provider = new FileExtensionContentTypeProvider(); foreach(string key in option.Value.Keys) { provider.Mappings.Add(key, option.Value[key]); } app.UseStaticFiles(new StaticFileOptions() { ContentTypeProvider = provider }); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
因為FileExtensionContentTypeProvider預設的構造函數mime基本已經定死了 而。NET core的網站 很多是不採取iis設置的
FileExtensionContentTypeProvider代碼地址 大家可以去看看https://github.com/aspnet/StaticFiles/blob/dev/src/Microsoft.AspNetCore.StaticFiles/FileExtensionContentTypeProvider.cs
第三個坑 .NET Core 2.0 MVC 的試圖文件
從2.0開始貌似試圖文件被直接打包成了dll文件,不在像傳統的mvc一樣發佈後還是shtml文件,而是被編譯成了dll文件 命名規則是 項目名稱.PrecompiledViews.dll
第四個坑 .NET Core 引用DLL問題
我們以前開發總是把一些常用的某些功能性的單獨做成一個類庫 編譯成dll 後供項目使用,但這樣做好像在.NET Core的項目中行不通
起初我寫了一個公共的類庫,在解決方案裡面又新增了一個類庫,去引用公共類庫的項目,這樣做的時候並沒有什麼異常,但當我啟動另外一個vs創建一個新的解決方案添加項目在去引用公共類庫的dll後 在vs裡面寫代碼都很正常,代碼提示也都有
但是一按F5 調試就出來坑了,報未能找到類型或命名空間
解決方案是把公共類庫打包 生成NuGet包
然後通過管理NuGet包添加引用,但很多情況下 一些類庫我並不想都放到nuget.org上面,可以把生成的nuget包放置Microsoft Visual Studio Offline Packages 離線包裡面
放到Microsoft Visual Studio Offline Packages對應的目錄即可