跳到主要內容

發表文章

目前顯示的是有「asp.net MVC」標籤的文章

ASP.NET Web API 未認證時傳回 Code 404 而非 401

今天在開發簡單的 Web API 時發生一個奇妙的問題,原本應該傳回 401 Unauthorized 卻傳回  404 Not Found ,令我百思不得其解。

SQL Server 使用者定義的資料表錯誤 User-Defined Table Type Error

最近有個新專案,由於資料表的欄位很多,還要Call Stored Procedure,所以請DBA將資料表做成User-Defined Table Type,沒想到我呼叫Stored Procedure更新時發生一個錯誤:    將 nvarchar 資料類型轉換成 datetime 資料類型時,產生超出範圍的值。 資料表值參數 "@MyUDT" 的資料不符合參數的資料表類型。SQL Server 錯誤為: 242,狀態: 3 陳述式已經結束。   使用User-Defined Table Type(以下簡稱UDT)做為參數非常簡單大概就是 SqlParameter parameter = new SqlParameter("@MyUDT", SqlDbType.Structured); parameter.Value = dataTable; 乍看之下會以為是資料內容錯誤,但這次我的內容人工出對後完全沒錯,欄位名稱也對。經過一天一夜的試誤,終於發現問題出在: 欄位順序 ! 以前我自己寫ADO.Net呼叫時,都會利用資料表先做出一個XML Schema(xsd),利用DataTable.ReadXmlSchema 產生結構,這樣Data Table裡的欄位順序絕對不會錯;而這次首度使用 List to DataTable 的公用程式自動產生DataTable,不用另外去產生XSD,整個程式變很順,不需要一個一個欄位塞值。 以上提供也使用UDT 做為SqlParameter的朋友參考。 後記:最近在測試時又發生過一次錯誤,是UDT屬性裡某個Not Null的欄位在DataTable裡缺值為null,也會造成呼叫UDT時錯誤。

ASP.Net 遇到 JSON 格式的日期會差8小時問題

最近開始試著學 ASP.Net Core ,用 .Net 5 寫WebAPI。用前端的 DatePicker 選日期會變成前一天,再追下去,居然是DateTime都會少8小時,這到底是怎麼一回事呢?可能是我之前都沒有用MVC的Model去解析JSON物件,所以沒有發生。 用 股溝 搜尋在 暗黑大的文章 有提到這問題,但我不太相信微軟會犯這種低級錯誤,所以再繼續追下去真正原因。 先假設 Model 裡有一個 public DateTime StartDate {get; set;} WebAPI接收到前端吐回的JSON Date 字串後,會解析成  StartDate.Kind 會是 DateTimeKind.Utc; 這沒錯,若是 DateTime now = DateTime.Now; now.Kind 是 DateTimeKind.Local 所以存到SQL Server時,變成UTC時區,而SQL Server讀取的時候,會依照儲存的時區把資料吐出來,再自己把DateTime.ToString("yyyy/MM/dd")時,就會變成前一天了@@。 目前我的解法是在儲存到SQL Server前, StartDate = StartDate.ToLocalTime();  若是在讀取時轉換應該也行啦,但我的情況和暗黑大一樣,使用者都在這小島內,不會跨時區,用最簡單的方式處理就好。就算有人跨時區使用, DateTime.ToLocalTime() 也不會有錯誤。 結案收工。

Dot Net Nuget Error : error NU1202 Microsoft.OpenApi 1.2.3 不支援任何目標架構

最近編某一個專案,用OpenApi一直出現「Microsoft.OpenApi 1.2.3 不支援任何目標架構」,這樣奇怪的錯誤。猜想是某個設定檔錯誤,於是產生新專案來測試: 我用的是2021/5最新的dotnet 5.0.203,到另一臺電腦測試完全沒問題。所以想應該是元件註刪之類的問題,結果我錯了,在偉大的 StackOverFlow找到答案 ,清除NuGet快取:   nuget locals all --clear 清空快取後,就恢復正常,可以回來工作,繼續爆肝。

在Server 2003 的 IIS 6 使用ASP.Net MVC 4

因為在下手上的Server大部份都還是Windows Server 2003,所以佈署時多半還是考慮使用 .Net framework 4.0,因此停留在ASP.Net MVC 4。今天做了一個新的小工具放在Intranet,卻無法使用。 搜到網路上許多的解答,甚至有寫說要設定spnet_isapi.dll 在萬用字元 *.* 等等,很抱歉,並非正解。

ASP.Net 同時使用Windows Authentication與Forms Authentication混合認證 Mixed Security

最近主管又指示我寫一個小東西,要讓員工及有往來客戶都能使用。所以網站建置在內網,再利用Proxy導向對外網站。但是內網(Intranet)的用戶仍然要使用Windows Authentication(aka NTLM Authentication),而且Windows認證不支援proxy,除非使用Windows 的特殊proxy或丟到Windows Azure雲端。 這下我就很頭大了,只有找到Asp.net 1.1 的  Mixing Forms and Windows Security in ASP.NET ,下載安裝還是不成功。幸好帥學弟之前就有Survey過,提供兩個參考資料: How I Made Windows Authentication and Forms Authentication Work Together  與   Combining Windows Authentication with Forms Authentication in ASP.NET  。

Entity Framework 5 Code First 遇到 context has changed 的問題

我在做一個Asp.net MVC 4 + Entity Framework 5 RC的專案遇到一個問題,就是新增加的Model做 當初是Code First開發,而且我什麼都沒做就很正常地運作。但是後來我再加上一個Model Class後,居然就不會自動更新。錯誤訊息是 The model backing the 'XXXXContext' context has changed since the database was created. Consider using Code First Migrations to update the database ( http://go.microsoft.com/fwlink/?LinkId=238269 ) 那個連結會導到 這裡 ,不完全解答我的問題。 這裡 有高手介紹Entity Framework 4.3.1的做法。 我就想說Let it be,不要再繼續Code First,接下來手動就好,找到在DbContext Class加上這個method protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.IncludeMetadataInDatabase = false; } 很可惜,在Entity Framework 5.0 RC改了,所以要寫成 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<System.Data.Entity.Infrastructure.IncludeMetadataConvention>(); } 這樣就不會去檢查資料庫是否比Context舊。 Update: 不知為何又不行了,只好回過頭找Package Manager Console失敗的原因,發現packages不知何時多裝一個EntityFramework 4.3.1,砍掉之後重新啟動Visual Studio,後來就可以正常Mirgation。