Web アプリケーションで log4net のストアド プロシージャを使用して更新しようとしている SQL Server テーブルに、NULL 可能な GUID 列があります。このブログ記事
で説明されているプロパティ プロバイダー アプローチを使用して、log4net LogicalThreadContext でプロパティを設定するためのベスト プラクティスとして、実行時に log4net がオブジェクトのメソッドを呼び出して、ASP によって破壊されることなく値を取得するという事実を利用しています。 .NET スレッド切り替え:Application_BeginRequest
ToString
protected void Application_BeginRequest() {
log4net.LogicalThreadContext.Properties["userid"] = new UserIdProvider();
UserIdProvider は次のとおりです。
public class UserIdProvider {
public Guid IConvertible() { //attempt at resolving error on IConvertible
if (HttpContext.Current.Request.IsAuthenticated) {
MembershipUser myObject = Membership.GetUser();
Guid currentUserID = (Guid)myObject.ProviderUserKey;
return currentUserID;
}
else {
return Guid.Empty;
}
}
public override string ToString() {
if (HttpContext.Current.Request.IsAuthenticated) {
MembershipUser myObject = Membership.GetUser();
Guid currentUserID = (Guid)myObject.ProviderUserKey;
return currentUserID.ToString();
}
else {
return null;
}
}
}
log4net レイアウト プロパティは次のとおりです。
<parameter>
<parameterName value="@UserID" />
<dbType value="Guid" />
<layout type="log4net.Layout.RawPropertyLayout">
<key value="userid" />
</layout>
</parameter>
ユーザー ID プロバイダーを使用すると、log4net は例外をスローします。
log4net:ERROR [AdoNetAppender] Exception while writing to database
System.InvalidCastException: Failed to convert parameter value from a
UserIdProvider to a Guid. ---> System.InvalidCastException: Object must
implement IConvertible.
これを確認した後、パブリックの Guid IConvertible() ビットをプロバイダーに追加しましたが、それは暗闇の中でのちょっとした刺し傷でした。
また、log4net で手先の早業を試して、dbType が文字列であることを伝え、ToString() オーバーライドを使用してパラメーターをストアド プロシージャに渡すかどうかを確認しようとしましたが、この例外が発生しました。 :
log4net:ERROR [AdoNetAppender] Exception while writing to database
System.InvalidCastException: Failed to convert parameter value from a
UserIdProvider to a String. ---> System.InvalidCastException: Object
must implement IConvertible.
log4netにnullを渡すには、RawPropertyLayoutを使用する必要があると思います。nullable intまたはnullable datetimeである他のプロパティからこれを知っています。
IConvertible メソッドを記述した方法に何か問題がありますか、または GUID を返すために UserIdProvider をまとめる必要がある別の方法がありますか?