1

Web アプリケーションで log4net のストアド プロシージャを使用して更新しようとしている SQL Server テーブルに、NULL 可能な GUID 列があります。このブログ記事
で説明されているプロパティ プロバイダー アプローチを使用して、log4net LogicalThreadContext でプロパティを設定するためのベスト プラクティスとして、実行時に log4net がオブジェクトのメソッドを呼び出して、ASP によって破壊されることなく値を取得するという事実を利用しています。 .NET スレッド切り替え:Application_BeginRequestToString

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 をまとめる必要がある別の方法がありますか?

4

1 に答える 1

1

オブジェクトは IConvertible を実装する必要があります。

あなたは実際にIConvertibleを実装していません

クラスは次のように定義する必要があります

public class UserIdProvider  : IConvertible
{

...

} 

これを行うと、おそらくさらにいくつかのメソッドを追加する必要があることに気付くでしょう。

詳細については、 http://msdn.microsoft.com/en-us/library/tyz9cd4z.aspxを参照してください。

于 2013-04-12T19:51:32.283 に答える