UWInfo Blog
發表新文章
[Join] | [忘記密碼] | [Login]
搜尋

搜尋意見
文章分類-#Author#
[所有文章分類]
所有文章分類
  • ASP.NET (48)
  • ASP.NET2.0 (15)
  • ASP.NET4.0 (34)
  • JavaScript (49)
  • jQuery (26)
  • FireFox (4)
  • UW系統設定 (3)
  • SQL (39)
  • SQL 2008 (25)
  • mirror (4)
  • SVN (4)
  • IE (9)
  • IIS (20)
  • IIS6 (1)
  • 閒聊 (7)
  • W3C (6)
  • 作業系統 (9)
  • C# (24)
  • CSS (12)
  • FileServer (1)
  • HTML 5 (11)
  • CKEditor (3)
  • UW.dll (13)
  • Visual Studio (16)
  • Browser (8)
  • SEO (1)
  • Google Apps (3)
  • 網站輔助系統 (4)
  • DNS (5)
  • SMTP (4)
  • 網管 (11)
  • 社群API (3)
  • SSL (4)
  • App_Inventor (1)
  • URLRewrite (2)
  • 開發工具 (6)
  • JSON (1)
  • Excel2007 (1)
  • 試題 (3)
  • LINQ (1)
  • bootstrap (0)
  • Vue (3)
  • IIS7 (3)
  • foodpanda (2)
  • 編碼 (2)
  • 資安 (3)
  • Sourcetree (1)
  • MAUI (1)
  • CMD (1)
  • my sql (1)
最新回應
  • Newtonsoft.Json.JsonConvert.DeserializeObject 失敗的情況
    test...more
  • dotnet ef dbcontext scaffold
    ...more
  • [ASP.NET] 利用 aspnet_regiis 加密 web.config
    ...more
  • IIS ARR (reverse proxy) 服務安裝
    ...more
  • [錯誤訊息] 請加入 ScriptResourceMapping 命名的 jquery (區分大小寫)
    ...more
  • 用 Javascript 跨網頁讀取 cookie (Cookie cross page, path of cookie)
    ...more
  • 線上客服 - MSN
    本人信箱被盜用以致資料外洩,是否可以請貴平台予以協助刪除該信箱之使用謝謝囉...more
  • 插入文字到游標或選取處
    aaaaa...more
  • IIS 配合 AD (Active Directory) 認証, 使用 .Net 6.0
    太感謝你了~~~你救了我被windows 認證卡了好幾天QQ...more
  • PostgreSQL 的 monitor trigger
    FOR EACH ROW 可能要改為 FOR EACH STATEMENT ...more
標籤
  • 88 order b
  • sqlcmd
  • cell
  • ashx
  • a
  • MIBs
  • PG
  • 14
  • query
  • -3679
  • SU
  • asp
  • for
  • 字串
  • google ORD
  • 必學
  • 網站
  • spf
  • 遠端
  • NPOI 弱點
  • image
  • ie11
  • 442
  • ascenlink
  • drop
  • a generic
  • SQL
  • ms_descrip
  • -1290
  • column
  • 36
  • svn
  • en
  • c
  • FireFox
  • web
  • orm
  • 5660
  • 3991
  • .
  • 版本
  • [t]
  • 280,
  • ef
  • [U2],
  • ping -n 25
  • 背景
  • -5461
  • 100
  • Rf
頁數 4 / 31 上一頁 下一頁
搜尋 ad 結果:
使用SemaphoreSlim來對非同步情況下使用Lock
由於在使用Await時,系統的Thread並不保證會與該function使用同一個Thread。
因此使用lock將單一Thread鎖住會導致出現 'Cannot await in the body of a lock statement'的錯誤

將Lock物件改成使用SemaphoreSlim,於function起始與結束加入WaitAsync與Release即可達到Lock的效果。

SemaphoreSlim完整介紹 : 用 SemaphoreSlim 來做 async/await 的鎖定
使用如下圖↓

 
 
More...
梨子, 2023/3/23 下午 03:00:41
Swashbuckle XML檔設定顯示文件註解
 
在註冊Swagger時如圖中
1. 將各自action名稱代用不同編碼,避免名稱相撞導致swagger不能正確辨識。
2. 將專案XML輸出改為專案名稱($(AssemblyName))供註冊時指定反射用
↓ (對專案點擊右鍵 => 屬性 => 生成(Build) => 輸出(Output) => XML 文件名稱(XML documentation file path))
 
 
More...
梨子, 2023/3/23 上午 10:20:46
.Net 7 的坑 UseStaticFiles 無效, 被 Routing Rule 攔截了
在新增 .Net 7 專案時。不用特別指定 app.UseRouting() 就可以使用 attribute routing.

但會遇到一個問題:

原來應該出靜態檔案的 Request 會被符合 Routing Rule 的 Action 攔截。

解決的方法是 :

在 UseStaticFiles 之後手動再加上 app.UseRouting(), 範例如下:

app.UseStaticFiles(new StaticFileOptions
{
    OnPrepareResponse = ctx =>
    {
        const int durationInSeconds = 60 * 60 * 24 * 365; //一年
        ctx.Context.Response.Headers[HeaderNames.CacheControl] =
            "public,max-age=" + durationInSeconds;
    }
});

app.UseRouting();
More...
Bike, 2023/3/2 下午 03:32:41
dotnet ef dbcontext scaffold
錯誤訊息:
dotnet : 因為找不到指定的命令或檔案,所以無法執行。
位於 線路:1 字元:1
+ dotnet ef dbcontext scaffold "Host=xxxxxxxxxxxxx;CommandTimeout=500 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (因為找不到指定的命令或檔案,所以無法執行。:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
可能的原因包括:
  * 內建 dotnet 命令拼寫錯誤。
  * 您預計要執行 .NET 程式,但不存在 dotnet-ef。
  * 您預計要執行全域工具,但在 PATH 上找不到此名稱且開頭為 dotnet 的可執行檔。
 
解決方法:
重新安裝套件,安裝指令:dotnet tool install --global dotnet-ef


 

參考:
dotnet ef 找不到指定的命令
 
More...
Reiko, 2023/2/13 下午 04:36:03
VS 2022 套件管理器主控台 亂碼
Console主控台的輸出,只要是非英文,都會是亂碼呈現



情況:
 
解決方法:
輸入:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8



 
 
參考:
一次解決CONSOLE主控台輸出中文亂碼的編碼問題
【茶包射手日記】PowerShell 串接 EXE 輸出中文變亂碼
More...
Reiko, 2023/2/13 下午 04:25:51
.Net 6 的 Captcha 實做
產生 FileStreamResult 物件的 function 如下: (目前置於 SU 之中,以便轉移)

        static List<Brush> CaptchaBrushes = null;
        public static FileStreamResult CreateCaptcha(string captcha)
        {
            if (CaptchaBrushes == null)
            {
                CaptchaBrushes = new List<Brush>();
                CaptchaBrushes.Add(Brushes.White);
                CaptchaBrushes.Add(Brushes.Gold);
                CaptchaBrushes.Add(Brushes.LightSkyBlue);
                CaptchaBrushes.Add(Brushes.LimeGreen);
                CaptchaBrushes.Add(Brushes.AliceBlue);
                CaptchaBrushes.Add(Brushes.AntiqueWhite);
                CaptchaBrushes.Add(Brushes.BurlyWood);
                CaptchaBrushes.Add(Brushes.Silver);
            }

            int width = 90;
            int height = 45;

            //https://stackoverflow.com/questions/61365732/cannot-access-a-closed-stream-when-returning-filestreamresult-from-c-sharp-netc
            //Using statements close and unload the variable from memory set in the using statement which is why you are getting an error trying to access a closed memory stream.You don't need to use a using statement if you are just going to return the result at the end.

            //這個 memory stream 不用關閉或 dispose
            var ms = new MemoryStream();

            // 釋放所有在 GDI+ 所佔用的記憶體空間 ( 非常重要!! )
            using (Bitmap _bmp = new Bitmap(width, height))
            using (Graphics _graphics = Graphics.FromImage(_bmp))
            using (Font _font = new Font("Courier New", 24, FontStyle.Bold)) // _font 設定要出現在圖片上的文字字型、大小與樣式
            {
                // (封裝 GDI+ 繪圖介面) 所有繪圖作業都需透過 Graphics 物件進行操作
                _graphics.Clear(Color.Black);

                // 如果想啟用「反鋸齒」功能,可以將以下這行取消註解
                //_graphics.TextRenderingHint = TextRenderingHint.AntiAlias;

                // 將亂碼字串「繪製」到之前產生的 Graphics 「繪圖板」上
                var x = 10;
                for(var i = 0; i < captcha.Length; i++)
                {
                    _graphics.DrawString(captcha.Substring(i, 1), _font, CaptchaBrushes[Su.MathUtil.GetRandomInt(CaptchaBrushes.Count)], x, Su.MathUtil.GetRandomInt(15));
                    x += 10 + Su.MathUtil.GetRandomInt(10);
                }

                // 畫線
                
                _graphics.DrawLine(new Pen(CaptchaBrushes[Su.MathUtil.GetRandomInt(CaptchaBrushes.Count)], 1),
                    Su.MathUtil.GetRandomInt(0, Convert.ToInt32((width * 0.9 / 2))), 0, Su.MathUtil.GetRandomInt(Convert.ToInt32(width / 2), Convert.ToInt32(width * 1.9 / 2)), height);
                
                _graphics.DrawLine(new Pen(CaptchaBrushes[Su.MathUtil.GetRandomInt(CaptchaBrushes.Count)], 1),
                    Su.MathUtil.GetRandomInt(Convert.ToInt32(width / 2), Convert.ToInt32(width * 1.9 / 2)), 0, Su.MathUtil.GetRandomInt(0, Convert.ToInt32((width * 0.9 / 2))), height);
                
                _graphics.DrawLine(new Pen(CaptchaBrushes[Su.MathUtil.GetRandomInt(CaptchaBrushes.Count)], 1),
                    0,
                    Su.MathUtil.GetRandomInt(height / 2),
                    width,
                    height / 2 + Su.MathUtil.GetRandomInt(height / 2)
                    );

                _graphics.DrawLine(new Pen(CaptchaBrushes[Su.MathUtil.GetRandomInt(CaptchaBrushes.Count)], 1),
                 0,
                 height / 2 + Su.MathUtil.GetRandomInt(height / 2),
                 width,
                    Su.MathUtil.GetRandomInt(height / 2)
                 );

                _bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            }

            ms.Seek(0, SeekOrigin.Begin);

            // Controller 的型別為 FileResult
            return new FileStreamResult(ms, "image/jpeg")
            { FileDownloadName = $"{DateTime.Now.Ymdhmsf()}.jpg" };
        }



輸出用的 Controller 和 Action 如下:

namespace Web.Controllers
{
    public class CaptchaController : Controller
    {
        [Route("captcha")]
        public async Task<FileStreamResult> Index()
        {
            //產生 Captcha 並存入 Session 之中。目前是四位數字
            string captcha = (await Ah.ReGetAsync<object>("api/kol/create-captcha-code")).ToString();

            //產生圖檔並回傳 FileStreamResult
            return Su.Wu.CreateCaptcha(captcha);
        }
    }
}
More...
Bike, 2022/9/25 下午 10:03:44
資安問題 -- Session Id 為什麼要加密後再存於 Client 端
接到弱掃報告指出以下的程式碼會造成危害:

string Url = WebConfigurationManager.AppSettings["SkyShopCheckoutURL"] + $"/api/token/ {Su.Fsc.SessionId}"; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HttpClient client = Su.Wu.GetClient();
var response = await client.GetAsync(Url);
var message = await response.Content.ReadAsStringAsync(); result = JsonConvert.DeserializeObject(message);

沒想到吧...
More...
Bike, 2022/9/23 上午 05:40:51
資安問題 -- 使用者輸入的資料成為檔名的一部份
使用者輸入的資料包括 cookie 的資料, header 的資料,form 和 query string 的資料。

可以使用以下的 function 避免寫入錯誤的檔案:

var newFilename = filename.Replace("..", "").ValidFilenameCharacters();
More...
Bike, 2022/9/22 下午 09:40:56
資安問題 -- Random 的替代 function
        static System.Security.Cryptography.RandomNumberGenerator RandomNumberGenerator = null;

        /// <summary>
        /// 回傳大於等於 0 小於 1
        /// </summary>
        /// <returns></returns>
        public static double NextDouble()
        {
            if (RandomNumberGenerator == null || LastRandomGenerateTime < DateTime.Now.AddMinutes(-1))
            {
                RandomNumberGenerator = System.Security.Cryptography.RandomNumberGenerator.Create();
            }

            // Generate four random bytes
            byte[] four_bytes = new byte[4];
            RandomNumberGenerator.GetBytes(four_bytes);

            // Convert the bytes to a UInt32
            uint scale = BitConverter.ToUInt32(four_bytes, 0);

            // And use that to pick a random number >= min and < max
            // 0 <= (scale / (uint.MaxValue + 1.0)) < 1
            return scale / (uint.MaxValue + 1.0);
        }

        /// <summary>
        /// 回傳值介於 min ~ (max - 1)
        /// </summary>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <returns></returns>
        public static int GetRandomInt(int min, int max)
        {
            if(max < min)
            {
                throw new Exception("最大值不可小於最小值");
            }

            // Generate four random bytes
            byte[] four_bytes = new byte[4];
            RandomNumberGenerator.GetBytes(four_bytes);

            // And use that to pick a random number >= min and < max
            return (int)(min + (max - min) * NextDouble()); //因為 NextDouble 會小於 1,所以用無條件捨去.
        }

        /// <summary>
        /// 產生 0 ~ (max - 1) 的亂數
        /// </summary>
        /// <param name="max"></param>
        /// <returns></returns>
        public static int GetRandomInt(int max)
        {
            return GetRandomInt(0, max);
        }

        /// <summary>
        /// 產生 0 ~ (int.MaxValue - 1) 的亂數
        /// </summary>
        /// <returns></returns>
        public static int GetRandomInt()
        {
            return GetRandomInt(int.MaxValue);
        }
More...
Bike, 2022/9/22 下午 08:30:03
VS2022 上面安裝 NSwag (.Net 6.0)
改用 NSwag 時直接 Copy 舊專案,發現找不到 AddOpenApiDocument 和 UseOpenApi 以及 UseSwaggerUi3 如下圖:

 
 

找了一些文件,要求安裝套件,都沒有用,後來發現在 Dependencies 的 Packages 直接新增 NSwag.AspNetCore 即可 





 
不要用 NuGet Package Manager 哦...
More...
Bike, 2022/9/3 下午 05:31:14
|< 12345678910… >|
頁數 4 / 31 上一頁 下一頁
~ Uwinfo ~