亂馬客

Hello! 我是 RM

  • 首頁
所有文章 友鏈 關於我

亂馬客

Hello! 我是 RM

  • 首頁

使用 OpenTracing - Jaeger (BFv3 使用 Fody)

2019-02-19

前言

在前一篇 使用 OpenTracing - Jaeger (BFv3 使用 Dynamic Proxy) 中,我們透過 Dynamic Proxy 的方式去封裝那些需要記錄的物件。
雖然使用 Dynamic Proxy 的方式,可以讓我們將那些 OpenTracing 的範本程式碼抽離出來,但是在專案還是需要做一些調整,例如使用 Autofac, 修改 Method 為 virtual methods 。 這對於沒有使用 Dependency Injection 的系統來說,是一個負擔。 那是否可以做到像 dynaTrace 這樣,直接寫到 bytecode 之中呢?

研究

Fody

上網 Search 後,除了可以透過 .NET Profiling API 外,還可以透過 IL Rewriting 的方式,可以讓我們在 Compile 時,動態地把程式寫到我們註記的地方, 運作方式如下,

.NET Source Code => Compiler => Managed assembly(CIL) => Fody => CIL weaving => modified CIL
所以它會拿我們 Build 好的 DLL 去加程式碼後,再產出一個新的 DLL 蓋掉原本的。

Fody Addins

Fody 目前有蠻多的 Fody Addins,大家只要從 Nuget 加入它們,然後在 FodyWeavers.xml 中設定要用的 Addin ,再依 Addin 需要的 程式碼及在程式中加入 Addins 的 Attribute ,重新建置就可以了。
常用的有 ToString.Fody, NullGuard.Fody, PropertyChanged.Fody 及 Janitor.Fody。
大家可以看看 Fody Addins 中,有沒有想要用在專案之中的哦!
而針對 Opentracing 這樣子的行為,有看到 MethodBoundaryAspect.Fody 蠻適合拿來用的,所以我們就用它來實作。

使用 MethodBoundaryAspect.Fody

規劃流程

我們的 OpenTracing 的程式碼都是很固定的,所以可以將它們分別放到 MethodBoundaryAspect.Fody 中的 OnEntry, OnExit 及 OnException 這 3 個 Methods 之中。
再來就是要考量的是,如何接由 Bot Connector 傳進來的 Jaeger Http Header 資料。 所以可以在 Global.asax 的 Application_BeginRequest 中接收,然後指定給 Addin 屬性中的 static AsyncLocal 的變數,當然在 Call 外部 api 時,也要將目前的 ActiveSpan 放到 Http Header 之中。

實作

加入 OpenTracing Jaeger Client

這部份請參考 使用 OpenTracing - Jaeger - .NET FRAMEWORK (以 BFV3 訂便當 BOT 為範例) 區段的介紹,加入需要的 Nuget 套件及 Jaeger Client DLL 後,在 Globa.asax.cs 的 Application_Start Method 去註冊 Jaeger,如下,

1
2
3
4
5
6
// using Opentracing
var tracer = new Jaeger.Tracer.Builder("訂便當Bot")
.WithSampler(new ConstSampler(true))
.Build();

GlobalTracer.Register(tracer);

加入 MethodBoundaryAspect.Fody

從 Nuget 中加入 MethodBoundaryAspect.Fody ,

然後在 FodyWeavers.xml 中加入 MethodBoundaryAspect.Fody ,如下,

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"
VerifyAssembly="true">
<MethodBoundaryAspect />
</Weavers>

使用 VerifyAssembly=”true” 的原因是因為我們想要在插入 IL 時,檢查看看是否有錯誤,才不會在執行時發生**System.InvalidProgramException: Common Language Runtime detected an invalid program.**的錯誤訊息。

實作 OpenTracingLogAttribute

繼承自 OnMethodBoundaryAspect ,在 OnEntry, OnExit 及 OnException 這 3 個 Methods 之中寫入 Opentracing 的程式碼,其中包含 async 的處理,如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
public class OpenTracingLogAttribute : OnMethodBoundaryAspect
{
//接由外部 service 傳入的 Header 資料
public static AsyncLocal<Dictionary<string, string>> TracerHttpHeaders =
new AsyncLocal<Dictionary<string, string>>();

/// <summary>
/// 判斷是否要 Log 到 OpenTracing 之中
/// </summary>
/// <param name="operationName"></param>
/// <returns></returns>
/// <remarks>
/// 有些 async 的Method 並不想要記錄,所以在此判斷
/// </remarks>
private bool IsNeedLog(string operationName)
{

string[] ignoreMethodNames = new string[]
{
"SetStateMachine.<",
"MoveNext.<"
};
var result = !ignoreMethodNames.Any(ig => operationName.StartsWith(ig));
return result;
}


public override void OnEntry(MethodExecutionArgs args)
{
if (!GlobalTracer.IsRegistered()) return;
var operationName = $"{args.Method.Name}.{args.Method.ReflectedType.Name}";
if (!IsNeedLog(operationName)) return;

var tracer = GlobalTracer.Instance;
var spanBuilder = tracer.BuildSpan(operationName);
if (tracer.ActiveSpan != null)
{
spanBuilder.AsChildOf(tracer.ActiveSpan);
}
else if (TracerHttpHeaders.Value != null)
{
// check http
var parentSpanCtx = tracer.Extract(BuiltinFormats.HttpHeaders, new TextMapExtractAdapter(TracerHttpHeaders.Value));
spanBuilder.AsChildOf(parentSpanCtx);
}
var activeScope = spanBuilder.StartActive(true);
args.MethodExecutionTag = activeScope;

}

public override void OnExit(MethodExecutionArgs args)
{
if (!GlobalTracer.IsRegistered()) return;
var operationName = $"{args.Method.Name}.{args.Method.ReflectedType.Name}";
if (!IsNeedLog(operationName)) return;

var returnTask = args.ReturnValue as Task;
if (returnTask != null)
{
//async 要加在後面
returnTask.ContinueWith(task => LogOnExit(args));
}
else
{
LogOnExit(args);
}

}

public override void OnException(MethodExecutionArgs args)
{
if (!GlobalTracer.IsRegistered()) return;
var operationName = $"{args.Method.Name}.{args.Method.ReflectedType.Name}";
if (!IsNeedLog(operationName)) return;

var returnTask = args.ReturnValue as Task;
//如果是 Task 在 OnExit 中處理
if (returnTask == null)
{
//這裡處理同步的部份
var activeScope = args.MethodExecutionTag as IScope;
Tags.Error.Set(activeScope.Span, true);
activeScope.Span.Log(new Dictionary<string, object> { ["error"] = args.Exception.ToString() });
activeScope.Dispose();
}

}

private void LogOnExit(MethodExecutionArgs args)
{
var activeScope = args.MethodExecutionTag as IScope;
var operationName = $"{args.Method.Name}.{args.Method.ReflectedType.Name}";
var returnTask = args.ReturnValue as Task;
if (returnTask != null && returnTask.IsFaulted)
{
//exception for async
Tags.Error.Set(activeScope.Span, true);
var exIndex = 0;
foreach (var ex in returnTask.Exception.InnerExceptions)
{
activeScope.Span.Log(new Dictionary<string, object> { [$"error{exIndex++}"] = ex.ToString() });
}
}
activeScope.Dispose();

}
}

接收外部傳入的 Jaeger Http Header

在 Global.asax.cs 中 Application_BeginRequest 中加入取得 Jaeger Http Header 然後指定給 OpenTracingLogAttribute 的 TracerHttpHeaders 屬性,如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected void Application_BeginRequest(object sender, EventArgs e)
{
//處理外部送進來的 opentracing data
var headerDict = new Dictionary<string, string>();
var headers = base.Context.Request.Headers;
foreach (var k in headers.AllKeys)
{
headerDict.Add(k, headers[k]);
}
if (headerDict.Count > 0)
{
OpenTracingLogAttribute.TracerHttpHeaders.Value = headerDict;
}
else
{
OpenTracingLogAttribute.TracerHttpHeaders.Value = null;
}
}

呼叫外部 Service 加入 Jaeger Http Header

我們要在呼叫 外部 Service 地方,加入 Jaeger Http Header,所以建議在生成 httpClient 時,可以統一由 Factory 來生成,如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
//add opentracing
if (GlobalTracer.IsRegistered())
{
var tracer = GlobalTracer.Instance;
var dictionary = new Dictionary<string, string>();
var span = tracer.ActiveSpan;
if (span != null)
{
tracer.Inject(span.Context, BuiltinFormats.HttpHeaders, new TextMapInjectAdapter(dictionary));
foreach (var entry in dictionary)
HttpClient.DefaultRequestHeaders.Add(entry.Key, entry.Value);
}
}

在需要記錄的 Class 中設定 OpenTracingLog 屬性

所以我們可以在 MessagesController, RootDialog 及需要記錄的 Class or Method 加入 [OpenTracingLog] 屬性就可以了 。

測試

當順利在 Class 或 Method 上加入 [OpenTracingLog] 屬性後,就可以把 Jaeger 開起來,並執行程式跑看看,我一樣使用 訂便當 BOT 來測試。
執行後,可以順利從 Jaeger Search UI 中看到從 Bot Connector => Bot => Bot Connector 都串起來了,如下,

  • 註 1: 除了加在 Class or Method 上,也可以針對整個 Assembly 去設定,可以在 AssemblyInfo.cs 中設定,它會加入到 public method & properties 之中,如下,
1
[assembly: OpenTracingLog]
  • 註 2: 目前 MethodBoundaryAspect.Fody 只 Support 整個 assembly, class 、 methods 及屬性,還不 Support 一些 Filters。
  • 註 3: PEVerify of the assembly failed. jmp / exception into the middle of an instruction.
    如果在建置過程中有出現上面的 PEVerify 錯誤,請查看一下那個 Method 是不是為 async ,在最後少了 await Task.CompletedTask; 或是 return await Task.FromResult(null); 。
    我的狀況是因為有 if { … await } else { … await } 而它無法正確地找到對的地方把程式碼放進去。錯誤訊息為,

    Error Fody: PEVerify of the assembly failed.
    [IL]: Error: [xxx.dll : EasyLifeBot.Actions.AccountActionStrategy+d__3::$_executor_MoveNext][offset 0x000001d7] jmp / exception into the middle of an instruction.(Error: 0x80131847)

    • 註 4:一開始建議是先加在入口的地方,有需要再往後加。
    • 註 5: MethodBoundaryAspect.Fody使用上如果不是很順手的話,也可以參考使用 PostSharp試看看。

    雖然還是要寫一點點程式碼及設定,但是往自動化又進步了一些哦:)

    參考資料

    Fody
    MethodBoundaryAspect.Fody
    DynamicProxy
    List of .Net Profilers: 3 Different Types and Why You Need All of Them
    .NET Profilers and IL Rewriting - DDD Melbourne 2
    Monitoring and Observability in the .NET Runtime
    How to mock sealed classes and static methods
    .NET Profiling API
    PostSharp

    • OpenTracing
    • Distributed Tracing
    • Jaeger
    • APM
    • Dynatrace
    • .NET
    • BFv3
    • Fody
    • MethodBoundaryAspect.Fody
    • IL Rewriting
    • IL weaving
    • PostSharp
    Inheritance security rules violated by type: 'System.Net.Http.WebRequestHandler'
    使用 OpenTracing - Jaeger (BFv3 使用 Dynamic Proxy)
    © 2025 亂馬客
    Hexo Theme Yilia by Litten
    • 所有文章
    • 友鏈
    • 關於我

    tag:

    • SQL
    • deadlock
    • 交換事件
    • exchangeEvent
    • log4net
    • Composite
    • RollingFileAppender
    • DetermineCurSizeRollBackups
    • InitializeRollBackups
    • InitializeFromOneFile
    • Aspose.Words
    • PDF
    • CompatibilityOptions
    • GrowAutofit
    • DocumentBuilder
    • InsertHtml
    • Session
    • EnableSessionState
    • SessionStateStoreProvider
    • Concurrent
    • mac
    • scrollbar
    • OPTIONS
    • IIS
    • 404
    • 要求篩選
    • Windows 10 IoT Core
    • Shutdown
    • Restart
    • iot:Capability
    • systemManagement
    • C00CE014
    • Angular
    • Service Worker
    • xamarin
    • ios11
    • MinimumOSVersion
    • MtouchArch
    • Deployment Target
    • ibtoolerror
    • aspose.words
    • NumberStyle
    • TradChinNum3
    • exec in t-sql
    • sql
    • execute
    • exec
    • How to get value to variable using 'execute' in t-sql?
    • cordova
    • ios 11
    • com.apple.CoreSimulator.SimDeviceType.undefined
    • ios
    • xCode 9
    • 從外部資料庫驅動程式產生的非預期的錯誤 (1)
    • Microsoft.Jet.OLEDB.4.0
    • kb4041691
    • kb4041681
    • kb4041676
    • kb4041678
    • 外部数据库驱动程序中(1)的意外错误
    • Unexpected error from external database driver (1)
    • Unexpected error from external database driver (1). (Microsoft JET Database Engine)
    • xcodebuild
    • exportArchive
    • exportOptionsPlist
    • Export Options property list
    • provisioningProfiles
    • Xcode 9
    • SMTPClient
    • MailMessage
    • Subject
    • ?號
    • Multiple
    • =?utf-8?B?
    • Attachments
    • Excel
    • SaveAs
    • 2148140012
    • 2146827284
    • Workbook
    • UWP
    • restart
    • disable update
    • beacon
    • QnA Maker
    • LUIS
    • Vital ESP
    • chatbot
    • FAQ
    • C#
    • botframework
    • BotBuilder
    • debug
    • luis.ai
    • predictions api
    • luis.ai 價格
    • MSA appId or password is incorrect
    • c#
    • botframework-emulator
    • custom error
    • exception handling
    • PostUnhandledExceptionToUser
    • IPostToBot
    • DialogModule
    • 1.2.10.0
    • 692fbea5521e1304
    • 1b44e1d426115821
    • CPU
    • 100%
    • WinDbg
    • ASP.NE
    • w3wp.exe
    • Aspose
    • SetLicense
    • NullReferenceException
    • BotDataStore
    • ConnectorStore
    • SmtpClient
    • SmtpConnection.GetConnection
    • .net
    • NetworkCredential
    • password
    • empty
    • DataGrid
    • .net 4
    • Paging
    • colspan
    • first column
    • ZAP
    • Certificate
    • Chrome
    • Firefox
    • Foxproxy
    • ERR_CERT_AUTHORITY_INVALID
    • Your connection is not private
    • 你的連線並不安全
    • JSON
    • Replace
    • special character
    • JavaScriptStringEncode
    • 當登記分置交易時發生錯誤
    • EnlistNonNullDistributedTransaction
    • EnlistDistributedTransaction
    • MSDTC
    • firewall
    • 協力電腦異動管理員已經停用了對遠端/網路異動的支援
    • BotFramework-WebChat
    • botchat.js
    • Botframework
    • Web Application
    • DirectLine
    • autofac
    • DialogModule.BeginLifetimeScope
    • IDialogTask
    • ScorableBase
    • aspose
    • aspose.cells
    • Html
    • Excell
    • IBotDataStore
    • FlushAsync
    • The data is changed
    • Aspose.Cells
    • datatable
    • Aspose.Pdf
    • pdf
    • watermark
    • 浮水印
    • asp.net
    • Aspose.Pdf.Facades.Stamp
    • BotToUser
    • ConnectorClient
    • TryAddWithoutValidation
    • Header
    • In-House certificate
    • expired
    • Provisioning Profiles
    • Revoke
    • keychain
    • No installed provisioning profiles
    • DataColumn
    • DefaultValue
    • RxJS
    • Development Environment
    • 環境設定
    • DOM
    • events
    • mousedown
    • mousemove
    • mouseup
    • touchstart
    • touchmove
    • touched
    • darw
    • iis
    • 403
    • 403.4
    • 403 - 禁止: 拒絕存取
    • 403.4 - Forbidden
    • Adaptive Cards
    • Microsoft Botframework
    • Customize Web Chat for your websites
    • http
    • 500
    • 內部伺服器錯誤
    • exception
    • NHibernate
    • GenericADOException
    • EncoderFallbackException
    • Unicode
    • adaptivecard
    • adaptive
    • Autofac
    • RegisterForEventValidation
    • EnableEventValidation
    • SSL/TLS
    • ServerCertificateValidationCallback
    • SecurityProtocol
    • order by
    • letters
    • numbers
    • jenkins
    • macos
    • node
    • npm
    • AppScan
    • 未更新階段作業 ID
    • 登入後變更階段作業 ID 值
    • Could not find a part of the path
    • roslyn\csc.exe
    • cells
    • excel
    • footer
    • 頁尾
    • TextState
    • fontlink\systemlink
    • Request.BinaryRead
    • ASP 0104
    • 2147467259
    • Windows 2008
    • 200k
    • Port
    • 465
    • 587
    • timeout
    • The operations timed out
    • hang
    • BFv4
    • WeChat
    • 微信
    • weixin
    • 公众平台
    • checkSignature
    • OpenTracing
    • Distributed Tracing
    • Jaeger
    • APM
    • Dynatrace
    • .NET
    • BFv3
    • Forms Authentication
    • Windows Authentication
    • Mvolo.FormsAuthenticationModule.dll
    • NodeJS
    • Dynamic Proxy
    • EnableClassInterceptors
    • EnableInterfaceInterceptors
    • AsyncInterceptor
    • Fody
    • MethodBoundaryAspect.Fody
    • IL Rewriting
    • IL weaving
    • PostSharp
    • System.Net.Http
    • 4.1.0.0
    • 軟體求生
    • js
    • document.formName
    • undefined
    • asp.net 4
    • Legacy
    • react
    • scrimba
    • javascript
    • vue
    • css
    • mssql 2017
    • table function
    • if
    • variable
    • Elasticsearch
    • Kibana
    • ASP.NET MVC
    • Controller
    • lambda_method
    • sql 2016
    • sql 2005
    • sql 2008
    • replace
    • rtrim
    • Microsoft Threat Modeling Tool
    • STRIDE
    • 威脅模型
    • checkmarx
    • Cookie_Injection
    • CSharp
    • non-printable characters
    • 不可視字元
    • Bitmap.save
    • GDI+
    • Odata
    • Cross site scripting
    • content-sniffing
    • ODataController
    • VS2017
    • VS2019
    • WebTest
    • ASPX
    • Postback
    • iisnode
    • nodejs
    • windows
    • PuppeteerSharp
    • ASP.NET
    • 程式什麼都有可能發生
    • DataGridItem
    • WebControl.Attributes
    • Win10
    • IE11
    • 不支援文化特性
    • zh-Hant-TW
    • 無效的文化特性識別項
    • .NET Core
    • AD
    • Authentication
    • LDAP
    • Novell.Directory.Ldap.NETStandard
    • aspnet_client
    • Unauthorized
    • bfv4
    • HttpClient
    • customHttpClient
    • Aspose.Pdf.Document
    • Pdf
    • 空白框框
    • characters are missing
    • charset
    • big5
    • FontRepository
    • MSGothic
    • NPOI
    • Windows 2012
    • Crash
    • Application Pool
    • 偵測到隱藏目錄
    • Forbidden
    • 77
    • font
    • DFKai-SB
    • broken
    • session
    • RewriteModule
    • 2147942433
    • overrideModeDefault="Deny"
    • allowedServerVariables
    • The iisnode module is unable to start the node.exe process.
    • machineKey
    • Authorization
    • authentication
    • User.Identity
    • FormsAuthentication.Decrypt
    • plus
    • +
    • filename
    • WorkbookDesigner
    • Smart Markers
    • Template
    • 套表
    • DataTable
    • DataSet
    • windows 10
    • ie
    • AD Login
    • 摘要式驗證
    • Digest Authentication
    • ef core
    • .NETStandard
    • ASP.NET Core
    • Dependency Injection
    • DI
    • input
    • file
    • vs.net
    • BC31007
    • Temporary ASP.NET Fiels
    • IE
    • Print
    • Print dialog
    • cookie missing
    • without session
    • cookieSameSite
    • X-XSS-Protection
    • Content-Security-Policy
    • X-Frame-Options
    • X-Content-Type-Options
    • Feature-Policy
    • Referrer-Policy
    • Audit.NET
    • DevAudit
    • OSSIndex
    • Mixed Content
    • CSP
    • upgrade-insecure-requests
    • 2148734209
    • TLS
    • HTTPS
    • 無法建立 SSL/TLS 的安全通道
    • WebException
    • AuthenticationException
    • 基礎連接已關閉
    • 遠端主機已強制關閉一個現存的連線
    • 接收到的訊息超出預期或格式不正確
    • 2148074278
    • 需要伺服器名稱指示
    • iframe
    • Uncaught DOMException
    • Blocked a frame with origin
    • DatabaseFacade
    • Migrate
    • EntityFrameworkCore
    • DbContext
    • SectionStart
    • SectionBreakOddPage
    • PageNumber
    • Blazor
    • WebAssembly
    • Server
    • Convert
    • sandbox
    • target
    • _parent
    • Unsafe JavaScript
    • svn
    • sharpsvn
    • export
    • prefix svn-
    • Forms Authentication Cookie
    • cross-site cookie
    • None
    • Logging
    • Api
    • MVC
    • GetTokenAsync
    • DelegatingHandler
    • IExceptionHandlerPathFeature
    • BeginScope
    • Blazor Server
    • EF Core
    • Invalid attempt to call ReadAsync when reader is closed
    • A second operation started on this context before a previous operation completed
    • ActiveX
    • Javascript
    • ActiveXObject
    • COMException
    • 2147943418
    • -2147023878
    • AADSTS50011
    • Azure
    • Azure AD
    • signin-azuread-oidc
    • Redirect URIs
    • case sensitivity
    • Adobe PDF
    • Printer
    • Alternative
    • PdfScribe
    • PDF Virtual Printer
    • 自造字
    • Add-Migration
    • Microsoft.EntityFrameworkCore.Tools
    • Node.js
    • axios
    • AxiosError
    • ECONNREFUSED
    • 127.0.0.1
    • ipv4
    • Key Vault
    • RBAC
    • DefaultAzureCredential
    • ClientSecretCredential
    • WebAPI
    • PUT
    • DELETE
    • VB.NET
    • Visual Basic
    • BC30201
    • BC30035
    • BC30157
    • BC30205
    • system.codedom
    • compiler
    • CORS
    • Corss-Origin Requests
    • 405
    • preflight
    • blocked by CORS
    • csp
    • Content Security Policy
    • default-src
    • unsafe-inline
    • modernizr-2.8.3.js
    • sha256-CwE3Bg0VYQOIdNAkbB/Btdkhul49qZuwgNCMPgNY5zw=
    • sha256-MZKTI0Eg1N13tshpFaVW65co/LeICXq4hyVx6GWVlK0=
    • sha256-LpfmXS+4ZtL2uPRZgkoR29Ghbxcfime/CsD/4w5VujE=
    • sha256-YJO/M9OgDKEBRKGqp4Zd07dzlagbB+qmKgThG52u/Mk=
    • Missing Content Security Policy
    • Checkmarx
    • Client_Side_Only_Validation
    • Page.IsValid
    • Page.Validate()
    • Dangerous_File_Upload
    • PostedFile.SaveAs
    • Server.MapPath
    • HSTS
    • automatic redirect from http to https
    • HTTP Strict Transport Security
    • Missing_HSTS_Header
    • Client_Heuristic_Poor_XSS_Validation
    • JavaScript
    • escape
    • encodeURI
    • DOMPurify
    • DOM base XSS
    • CryptographicException
    • BouncyCastle.Security
    • The system cannot find the file specified
    • Custom URI Scheme
    • Windows
    • OAuth2
    • Private-Use URI Scheme
    • zh-TW_pronun
    • CultureNotFoundException
    • Culture name zh-TW_pronun is not supported
    • 不支援文化特性名稱 zh-TW_pronun
    • Windows 10
    • 變更排序方法
    • Custom
    • Preset
    • JavaScript_Server_Side_Vulnerabilities
    • Jenkins
    • Incremental
    • 資安
    • 使用者密碼
    • Password
    • Heap Inspection
    • Custom Model Binder
    • SecureString
    • Excessive_Data_Exposure
    • byte Array
    • MVC5
    • netFramework
    • Heap_Inspection
    • WebForm
    • Slow
    • Https
    • 此網站的安全性憑證有問題
    • 檢查伺服器憑證撤銷
    • Razor Page
    • XXE
    • XmlDocument
    • XmlResolver
    • DtdProcessing.Prohibit
    • Insufficient_Connection_String_Encryption
    • Oracle
    • TCPS
    • MSSQL
    • PostgreSQL
    • Migration
    • ODBC
    • Database
    • SSMS
    • Export
    • BCP
    • MSB3644
    • 找不到 .NETFramework
    • Developer Pack
    • OWSAP Top 10 2021
    • Missing_Object_Level_Authorization
    • C# 9.0
    • NET5
    • record
    • pattern matching
    • Immutable Class
    • NET Conf
    • dotNETConf
    • dotNETConf 2020
    • .NET 5.0
    • OpenID Connect
    • OAuth
    • oidc
    • GetTempFileName
    • IOException
    • CrystalReports
    • ExportToHttpResponse
    • 檔案存在
    • The file exists
    • 65535
    • Path Traversal
    • Log_Forging
    • Progressive Web Application
    • PWA
    • Notification
    • Web Push
    • Cache
    • App Shell
    • Pre Cache
    • Install
    • manifest
    • VAPID
    • Voluntary Application Server Identification
    • Reflected_XSS_All_Clients
    • JsonNetResult
    • JsonResult
    • EscapeHtml
    • JsonConvert.SerializeObject
    • JsonSerializerSettings
    • TRIPLE_DES
    • SYMMETRIC
    • ALGORITHM
    • ResultFilter
    • Entity
    • DTO
    • ViewModel
    • ResultFilterAttribute
    • OnResultExecutionAsync
    • AutoMapper
    • fn_dblog
    • find Deleted records
    • REVERSE
    • 定序
    • COLLATE
    • 從 binary/varbinary 字串轉換成 datetime 時,轉換失敗
    • Trust_Boundary_Violation
    • Regex.IsMatch
    • UltraWebGrid
    • Infragistics
    • slow
    • system.webServer
    • Unrecognized configuration section 'system.webServer'
    • ASP.NET 1.1
    • V9.2.0
    • Unencrypted_Web_Config_File
    • web.config
    • Reflection
    • ReflectionMagic
    • Clean-Codes
    • Invokemember
    • MethodInfo
    • Visual Studio
    • Build Succeed
    • Errors
    • Intellisense
    • app.UseHttpsRedirection
    • HttpsPort
    • Abp
    • /libs/abp/core/abp.css
    • Basic.Global
    • install-libs
    • XML External Entity (XXE)
    • ReadXml
    • XmlReaderSettings
    • DtdProcessing
    • ABP
    • ABP Framework
    • DDD
    • .NET 1.1
    • ADO.NET
    • pre-login handshake
    • TCP Provider
    • AntV
    • G6
    • Update
    • Graph
    • G6.Graph
    • asp.net core
    • logger
    • custom
    • Cross-Site Scripting: Reflected
    • Cookieless
    • Response._appPathModifier
    • A(XXXX)
    • S(XXXX)
    • F(XXXX)
    • CookielessHelperClass
    • RemoveCookielessValuesFromPath
    • HTTP GET with request body
    • 4.x
    • Global.asax
    • Response.Write
    • utf-8
    • 亂碼
    • Gzip
    • Word
    • 空白框
    • square box
    • kangxi radical
    • unicode
    • 空白字
    • 標楷體
    • 全字庫
    • HTTP_Response_Splitting
    • Response.AddHeader
    • VBNET
    • UrlEncode
    • AZ305
    • AZ-305
    • Exam AZ-305
    • Azure Function
    • Function App
    • Queue trigger
    • Blob
    • Upload
    • File
    • MaxRequestBodySize
    • Request Entity Too Large
    • Request body too large
    • requestLimits
    • maxAllowedContentLength
    • dotnet
    • dotnet ef
    • dotnet-ef
    • 因為找不到指定的命令或檔案,所以無法執行
    • .NET 4
    • .NET 4.5
    • PropertyInfo.GetValue(System.Object)
    • Cannot find method definition
    • CS1501
    • DefaultRequestHeaders.Authorization
    • Privacy Violation
    • Office
    • 0x80080005
    • CO_E_SERVER_EXEC_FAILURE
    • Application.Documents.open()
    • Client_DOM_Open_Redirect
    • Client_Potential_DOM_Open_Redirect
    • Code_Injection
    • Invoke
    • forms-base authentication
    • 跨機器
    • Form驗證
    • cookie
    • domain
    • Single sign-on
    • SSO
    • Reporting Service
    • EUDC
    • Font
    • 造字程式
    • 950
    • 1252
    • Distinct
    • DataView
    • DataTable.AsEnumerable
    • Linq
    • CopyToDataTable
    • Red Team
    • Reconnaissance
    • DNS records
    • IP addresses
    • tsc
    • TS2307
    • Cannot find module
    • import
    • CASE-SENSITIVE
    • CentOS
    • forceConsistentCasingInFileNames
    • WebScoket
    • nginx
    • WAF
    • Error during WebSocket handshake
    • ERR_CONNECTION_RESET
    • 外網
    • Citrix NetScaler
    • TypeScript
    • dynamic
    • property
    • bracket-notation
    • Fiddler
    • netsh winhttp
    • Grafana
    • Loki
    • NLog
    • Serilog
    • MIME
    • ContentType
    • Download
    • csharp
    • Base64
    • Hex
    • Encode
    • Decode
    • string.Format
    • json
    • System.FormatException
    • Input string was not in a correct format
    • Kali Linux
    • WSL
    • Kex
    • Json.Deserialize
    • JsonSerializerOptions
    • PropertyNameCaseInsensitive
    • PropertyNamingPolicy
    • JsonNamingPolicy.CamelCase
    • GraphDatabase
    • JanusGraph
    • Gremlin
    • person
    • friends
    • path()
    • java
    • jar
    • class
    • no main manifest attribute
    • Storage
    • Queue
    • MaxDequeueCount
    • Function
    • poison
    • Kendo
    • JSZip
    • CVE-2021-23413
    • metasploit
    • portscan
    • tcp
    • scanner
    • auxiliary
    • scanner/portscan/tcp
    • meterpreter
    • Easy File Sharing Web Server
    • nmap
    • privilege escalation
    • reverse_tcp
    • msfvenom
    • exploit/multi/handler
    • msfconsole
    • mssql_payload
    • xp_cmdshell
    • mssql
    • MigrationToolkit
    • MTK
    • JDBC
    • Connection refused
    • ML.NET
    • p-Value
    • 0x80131509
    • outside expected
    • Regression.Trainers.Ols
    • MQTTnet
    • mosquitto
    • MQTT
    • allow_anonymous
    • mosquitto.conf
    • IOT
    • username
    • password_file
    • graph
    • all path
    • edge
    • select
    • FOR XML PATH
    • Owin.Security
    • Owin.Security.OpenIdConnect
    • AuthenticationProperties
    • AuthorizationCodeReceivedNotification
    • RDP
    • CredSSP
    • mstsc
    • 遠端桌面
    • Oracle 更新加密
    • SSRS
    • woff
    • ttf
    • Worker
    • worker_threads
    • cluster
    • XOR
    • Encrypt
    • Decrypt
    • 加密
    • 解密
    • 追蹤
    • User
    • Login
    • LDAP 伺服器無法使用
    • 提供的認證無效
    • azure
    • webapp
    • internal server error
    • sqlite
    • npm install
    • non-null
    • !
    • CS8602
    • CS8600
    • OAuth 2.0
    • PKCE
    • Proof Key for Code Exchange
    • claiming URLs
    • Custom URL Scheme
    • public client
    • Authorization Code Flow
    • response_type=code
    • grant_type=authorization_code
    • private client
    • oauth2
    • ROPC
    • Resource Owner Password Credentials
    • grant_type=password
    • Implicit Flow
    • response_type=token
    • response_mode=fragment
    • token flow
    • OpenSSL configuration error
    • Windows 10 環境變數
    • OpenIdConnectHandler.GetUserInformationAsync
    • OpenIdConnectHandler.HandleRemoteAuthenticateAsync
    • FortiGuard
    • SSL
    • oracle
    • 17002
    • 08006
    • IO Error
    • LEAD
    • CTE
    • Range
    • Rate
    • OWASP
    • OWASP Top 10 - 2021
    • connectionString
    • semicolon
    • single quote
    • PNG
    • TIFF
    • kaiu.tff
    • GhostscriptProcessor
    • GhostscriptRasterizer
    • Sequence
    • Migration Toolkit
    • pgAdmin
    • text/plain
    • not executable
    • strict MIME type
    • OpenTelemetry
    • OpenCensus
    • IHttpHandler
    • Static Files
    • TXT
    • XLS
    • StaticFile
    • Classic Mode
    • Integrated Mode
    • zip
    • 0x80131515
    • Import-Module
    • dll
    • Key
    • ProtectedData
    • Vault
    • RequestSizeLimit
    • Abp Framework
    • HttpContext.Features.MaxRequestBodySize
    • Web Application Firewall
    • ModSecurity
    • UrlScan
    • OWASP ModSecurity Core Rule Set
    • sql 2019
    • 15.0 RTM
    • 15.0.2000.5
    • Timeout
    • SQLPlan
    • SQL Injection
    • SQL Server
    • 資料交換
    • 異動資料
    • Database Snapshot
    • 資料庫快照集
    • SqlException (0x80131904)
    • Named Pipes Provider
    • Win32Exception(0x80004005)
    • SQL License
    • SQL援權
    • TCP
    • Handshake
    • Teams
    • meetings
    • behalf of a user
    • Microsoft Graph
    • Access Policy
    • No Application Access Policy found for this app.
    • OnlineMeetings.ReadWrite.All
    • teams
    • meeting
    • outlook
    • calendar
    • Calendars.ReadWrite
    • Connection Pooling
    • Auto Close
    • Connection
    • Pool
    • ExecuteReader
    • ExecuteReaderAsync
    • CloseConnection
    • TLS 1.2
    • Disable TLS 1.1
    • type/javascript
    • text/javascript
    • mime
    • SEC7112
    • ashx
    • Surrogate pair
    • CJK Compatibility
    • 難字
    • Char.IsSurrogatePair
    • Char.ConvertToUtf32
    • Bot
    • Disabled
    • Teams app validator
    • Org-wide app settings
    • Source Link
    • Debug
    • 來源支持
    • Microsoft Visual Studio
    • 無法將憑證新增至受信任的根憑證存放區
    • Adding the certificate to the Trusted Root Certificates store failed with the following error
    • Access is denied
    • 無法信任憑證
    • VMDK
    • VHD
    • Azure CLI
    • VMDK to Azure
    • VHD to Azure
    • VSCode
    • Console.ReadLine
    • internalConsole
    • 偵錯主控台
    • Docker
    • Visual Studio 2019
    • Dockerfile
    • COPY failed
    • Docker build
    • HTTP 400
    • UseHttpMethodOverride
    • X-HTTP-Method-Override
    • webpack
    • opensslErrorStack
    • ERR_OSSL_EVP_UNSUPPORTED
    • 3000086
    • digital envelope routines::initialization error
    • allowDefinition=MachineToApplication error
    • sessionState
    • Internet Explorer
    • Edge
    • Plugins
    • 防詐達人
    • AWS
    • IP
    • log
    • waf
    • Could not resolve host
    • curl
    • Windows Subsystem for Linux
    • OWASP Top 10
    • Blind SQL Injection
    • Unsafe_Reflection
    • V9.4.5
    • CWE-470
    • functional programming
    • retry
    • Partial
    • Curry
    • Property
    • 屬性
    • private set
    • testing
    • private
    • internal
    • Upgrade
    • v4
    • v5
    • Domain service
    • Repository
    • Specification
    • Ajax
    • 遺漏對 Sys.Application.notifyScriptLoaded() 的呼叫
    • Sys.Browser.name
    • Cannot read properties of null (reading '_notified')
    • DataSeedContributor
    • DataSeeder
    • duplicate key
    • AbpPermissionGrants
    • IX_AbpPermissionGrants_TenantId_Name_ProviderName_ProviderKey
    • SeedAsync
    • Domain Events
    • AddLocalEvent
    • ILocalEventHandler
    • AddDistributedEvent
    • Crystal Report
    • Response.Filter
    • Blank
    • SystemFontSource
    • SetFontsSources
    • FileFontSource
    • TTE
    • EF
    • Shadow
    • Indexer
    • property bag entity types
    • Dictionary
    • SharedTypeEntity
    • Owned Entity Types
    • OwnsOne
    • ValueObject
    • FILE
    • BIG5
    • UTF8
    • UTF8 BOM
    • Encoding
    • GetEncoding(950)
    • blank
    • 檔案已損壞且無法修復
    • Encoding.Default
    • TestBase
    • TestBaseModule
    • SeedTestData
    • appsettings
    • IConfiguration
    • AbpDataSeedOptions
    • Web.Tests
    • WebTestBase
    • CreateHostBuilder
    • Development
    • connect-src
    • violates
    • Access-Control-Allow-Origin
    • Power BI embedded
    • .NET Framework
    • AppOwnsData
    • ReportEmbedConfig
    • EmbedToken
    • bundled
    • minified
    • Hyperlink
    • 302
    • Microsoft Office Protocol Discovery
    • MigrateAsync
    • API
    • Route
    • normalized
    • ConventionalControllerSetting
    • AbpConventionalControllerOptions
    • ConventionalPrefixes
    • Connection Strings
    • AbpDbConnectionOptions
    • ConnectionStringName
    • ReplaceDbContext
    • Switch Tenant
    • Hide Tenant Switch
    • AbpMultiTenancyCookieHelper
    • CurrentTenant.Change
    • Disable
    • __doPostBack
    • Immediately-invoked Function Expressions
    • IIFE
    • semicolons
    • EWS
    • Exchange
    • Room
    • Exchange Web Service
    • 會議室
    • Unknown error (0x80005000)
    • Appointments
    • DirectorySearcher
    • 0x80005000
    • System.DirectoryServices
    • 無法指出的錯誤
    • FreeBusyAndSuggestions
    • GetUserAvailability
    • IIS Express
    • NET::ERR_CERT_AUTHORITY_INVALID
    • 你的連線不是私人連線
    • Swagger
    • Swagger UI
    • 400
    • Bad Request
    • Antiforgery
    • Tomcat
    • SSLHostConfig
    • 8443
    • CAS
    • cas-overlay-template
    • Tomcat 10
    • encrypt
    • disable
    • camera
    • permanent
    • TSQL
    • Performance
    • SARG
    • GroupId
    • ChannelId
    • Guid
    • listen
    • EACCES
    • port
    • permission denied
    • Novacode
    • Xceed
    • DocX
    • Table
    • InsertRow
    • Search
    • Address
    • Latitude
    • Longitude
    • Azure Map
    • 罕用字
    • fontforge
    • WOFF
    • White Box
    • GlyphInfo
    • ReportViewer
    • Hang
    • SQL Server Reporting Services
    • Discord
    • discord.js
    • Node
    • Express
    • Channel
    • DirectMessage
    • Reply
    • Client DOM Stored XSS
    • Client DOM XSS
    • CrystalDecisions.Web
    • Discrod機器人
    • powershell
    • failure
    • typescript
    • SyntaxError
    • Unexpected token
    • ipynb
    • nuget
    • package
    • vscode
    • restify
    • TypeError
    • Readable
    • V18
    • SK
    • Semantic Kernel
    • Skill
    • Joke
    • inline
    • function
    • WithAzureChatCompletionService
    • RegisterSemanticFunction
    • CreateSemanticFunction
    • ImportSemanticSkillFromDirectory
    • Heuristic_2nd_Order_SQL_Injection
    • SqlMapper
    • Path
    • Dapper
    • none
    • self
    • CS1988
    • await
    • async
    • Host
    • 自定Host
    • Windows 驗證
    • hosts
    • localhost
    • DisableStrictNameChecking
    • BackConnectionHostNames
    • MSDeploy
    • 8172
    • 無法從傳輸連接讀取資料
    • RC4
    • Triple DES
    • Client Hello
    • RST, ACK
    • Cookie
    • Empty Name
    • SqlException
    • 0x80131904
    • 0x80090325
    • 此憑證鏈結是由不受信任的授權單位發出的
    • Subscription
    • subscription filter
    • knex
    • Undefined
    • Raw.toSQL
    • CSRF
    • HttpClientFactory.CreateClient
    • proxy
    • 502
    • httpsAgent
    • Firewall
    • Ingress
    • Egress
    • node-pre-gyp
    • OpenAI
    • Assistants
    • UNABLE_TO_GET_ISSUER_CERT_LOCALLY
    • openai
    • assistants api
    • gpt4
    • ChatGPT
    • Usage tiers
    • GUID
    • Short
    • URL
    • 短網址
    • Base62
    • Base64UrlEncode
    • add
    • claims
    • oauth
    • AADSTS700016
    • Azure Bot
    • Single Tenant
    • Type of App
    • Supported account types
    • Kernel Memory
    • LLM
    • RAG
    • embeddings
    • MemoryWebClient
    • KernelMemoryBuilder
    • MemoryServerless
    • TextPartitioningOptions
    • Qdrant
    • MaxTokensPerParagraph
    • MaxTokensPerLine
    • OverlappingTokens
    • Chunks
    • Postgres
    • pgvector
    • CS8652
    • copy
    • folder
    • output
    • prompt
    • engineering
    • improving
    • 提示工程
    • Prompt
    • template
    • yaml
    • HandlebarsPromptTemplateFactory
    • plugins
    • Handlebars
    • Planners
    • Personas
    • KernelFunction
    • ChatCompletionService
    • semantic-kernel
    • DevExpress
    • XtraReport
    • Empty
    • IIS Application pool
    • aspNetCore
    • AspNetCoreModuleV2
    • Hosting Bundle
    • Compression
    • urlCompression
    • 靜態壓縮
    • doStaticCompression
    • doDynamicCompression
    • show only vulnerable
    • Nuget
    • DependencyCheck
    • ssl.com
    • Can not retrieve credential
    • eSigner
    • Signing credentials not configured
    • ipconfig
    • mac address
    • 實體位址
    • Spoofing
    • NetworkAddress
    • DevTools
    • Network
    • Console
    • Implicitly imported namespaces
    • .NET 6
    • 隱含全域 Using
    • Typescript
    • TS2411
    • TS2339
    • TS2536
    • TS2792
    • Unsafe Reflection
    • Assembly.LoadFile
    • molecular
    • chemical
    • formulas
    • DbMigrationService
    • apply-migrations-at-runtime
    • Microsoft.ML
    • OneDalDispatchingEnabled
    • MissingFieldException
    • dev-certs
    • appsettings.json
    • Middleware
    • ClaimsPrincipal
    • Identity.Application
    • ClaimsIdentity
    • getaddrinfo
    • Temporary failure in name resolution
    • ESET
    • 8001
    • DBNETLIB
    • ODBC SQL Server Driver
    • SQL Server does not exist or access denied
    • OdbcConnection
    • Bot Framework v4 SDK Templates for Visual Studio
    • ConfigureAppConfiguration
    • ConfigurationBuilder
    • AddJsonFile
    • Assistant
    • AgentBuilder
    • AOAI
    • LM Studio
    • Local Server
    • Phi-2
    • AutoInvokeKernelFunctions
    • ISemanticTextMemory
    • hallucinate
    • systemMessage
    • 參數幻覺
    • Security
    • UNABLE_TO_VERIFY_LEAF_SIGNATURE
    • unable to verify the first certificate
    • Code
    • id_token
    • access_token
    • FormsAuthentication
    • ToolCallBehavior
    • EnableKernelFunctions
    • Phi-3
    • AddOpenAIChatCompletion
    • AddAzureOpenAIChatCompletion
    • AI 面試官
    • AddHuggingFaceChatCompletion
    • AI Interviewer
    • 網路層級驗證
    • cookies
    • withCredentials
    • 第三方 Cookie
    • 267009
    • Task
    • 排程
    • Pause
    • bat
    • Potential Clickjacking on Legacy Browsers
    • Client_DOM_XSS
    • Always Encrypted
    • 運算元類型衝突
    • Stream
    • MemoryStream
    • ToArray
    • Read
    • BinaryReader
    • VS 2022
    • public
    • Swashbuckle
    • SwaggerUI
    • SwaggerUIOptions
    • Minimal API
    • Unicode escaped
    • Json
    • Regex.Unescape
    • TypeChat
    • JsonTranslator
    • RLS
    • EffectiveIdentity
    • ChatCompletionAgent
    • AutoGen
    • AgentGroupChat
    • ApprovalTerminationStrategy
    • GPT-4o
    • Captcha
    • OCR
    • Image
    • 手寫辨識
    • OpenAIAssistantAgent
    • Server_Dos_by_Loop
    • Unchecked_Input_For_Loop_Condition
    • 發票
    • invoice
    • Permissive Content Security Policy
    • Cognitive
    • AllowAnonymous
    • Authorize
    • ASP0026
    • abp
    • AppService
    • Policy
    • IPermissionChecker
    • 工作排程器
    • Duration
    • zh-Hans
    • zh-Hant
    • zh-CN
    • zh-TW
    • OpenCCNET
    • Text2SQL
    • NL2SQL
    • vanna-ai
    • ReferenceHandler.Preserve
    • recursion
    • Dynamic
    • Permission
    • PermissionDefinitionProvider
    • AbpPermissions
    • AbpPermissionGroups
    • IsDynamicPermissionStoreEnabled
    • Outlook
    • operation has been cancelled
    • AzureAD
    • Azure Active Directory
    • OpenIdConnect
    • cshtml
    • TextChunker
    • SplitPlainTextLines
    • SplitPlainTextParagraphs
    • Chunk
    • KM
    • Split
    • Enterprise applications
    • Entra ID
    • Assistant API
    • arguments
    • mis-encodes
    • Latin-1
    • SqlConnection
    • ConnectionString
    • CommandTimeout
    • SqlClient
    • Retrieval-Augmented Generation
    • 本地模型
    • SQLServer
    • cosine similarity
    • Decoder
    • TextDecoder
    • HtmlDecoder
    • PdfDecoder
    • MsPowerPointDecoder
    • MsWordDecoder
    • MarkDownDecoder
    • MsExcelDecoder
    • ubuntu
    • docker
    • dify
    • ssl
    • certificate
    • python
    • certifi
    • docker-compose
    • 台灣政府憑證
    • root ca
    • gcis.nat.gov.tw
    • 憑證問題
    • MSSQL 2019
    • 8632
    • 到達運算式服務的限制
    • MFA
    • Two-Factor Authentication
    • ABP MVC MFA
    • ASP.NET Core MFA
    • ABP 身份驗證
    • ABP 兩步驟登入
    • ABP 強制 MFA
    • Identity TwoFactor
    • ABP 多因素認證
    • Global.asax.cs
    • Application_PreSendRequestHeaders
    • Application_Start
    • X-AspNet-Version
    • X-AspNetMvc-Version
    • Server Header
    • AI整合
    • LangChain
    • Browser Extension
    • Web Automation
    • MCP-style
    • WXT
    • 無API架構
    • Web App Context
    • 瀏覽器擴充功能
    • Chrome Extension
    • SidePanel
    • AI工具整合
    • Dify 流程設計
    • 零程式碼 AI
    • LLM 自動化流程
    • Dify 教學
    • 查詢企業資訊
    • 無程式自動化
    • AI 工作流程設計
    • Dify 範例
    • apple silicon
    • m4
    • colima
    • podman
    • sql server
    • qemu
    • arm64
    • amd64
    • SQL Server 2025
    • AI 語義搜尋
    • AdventureWorks
    • VECTOR_DISTANCE
    • CREATE EXTERNAL MODEL
    • 向量搜尋
    • 產品語義查詢
    • SQL Server AI
    • AI_GENERATE_CHUNKS
    • AI_GENERATE_EMBEDDINGS
    • AI自動填表
    • 一鍵自動填表
    • AI填表神器
    • 網頁自動填表
    • wxt
    • AI自動化
    • langchain

      缺失模块。
      1、请确保node版本大于6.2
      2、在博客根目录(注意不是yilia根目录)执行以下命令:
      npm i hexo-generator-json-content --save

      3、在根目录_config.yml里添加配置:

        jsonContent:
          meta: false
          pages: false
          posts:
            title: true
            date: true
            path: true
            text: false
            raw: false
            content: false
            slug: false
            updated: false
            comments: false
            link: false
            permalink: false
            excerpt: false
            categories: false
            tags: true
      

    • 亂馬客-點部落
    • TechSmith
    • wintellectnow
    • 叡揚資訊
    • SSWTV
    • 技術RADAR
    • Framework 設計方針
    • Visual Studio Code for Web
    • SharpLab
    • .NET Fiddle
    • W3Schools C# Online Compiler
    • C# Coding Conventions
    大家好,我是亂馬客 Rainmaker,目前任職於叡揚資訊,大家也都叫我 RM 。 平常負責開發公司各產品線的加值、共用的軟體,例如 Azure, OpenAI, Chatbot, Database ... 同時 Support 公司各種技術及資安黑箱(AppScan)、白箱(Checkmarx)等問題的解決。 Blog中的內容也是個人的看法, 如果有需要討論的地方, 可以留言,或是 mail 給我 :) rainmaker_ho@gss.com.tw