1

我在我的 Web 应用程序中尝试使用来自 log4net 的存储过程来更新 SQL Server 表中有一个可为空的 GUID 列。
我正在使用此博客文章中描述的属性提供程序方法作为在 log4net LogicalThreadContext 中设置属性的最佳实践,Application_BeginRequest以利用在运行时 log4net 将调用对象的ToString方法来获取值而不会被 ASP 破坏的事实.NET 线程切换:

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.

我相信我需要使用 RawPropertyLayout 来让 log4net 传递空值。我从其他可以为空的 int 或可以为空的日期时间的属性中知道这一点。

我编写 IConvertible 方法的方式有什么问题,还是我需要将 UserIdProvider 放在一起以返回 GUID?

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 回答