匿名用户调用时,Web服务无法写入事件日志

时间:2009-07-22 20:26:56

标签: c# visual-studio web-services logging

摘要:如何配置Web服务,以便始终可以写入事件日志(无论调用者如何)? 细节: 我有一个Web服务,它将一个条目写入应用程序日志。我通过一个小的控制台应用程序为此建立了事件源,我想我理解这部分内容。当我测试这个WS时,我看到我成功地将我的条目写入了事件日志。

托管此WS的虚拟目录 NOT 允许匿名访问,并且仅针对集成Windows身份验证进行配置。

我有一个调用此Webservice的Web客户端应用程序。仅当Web客户端站点配置为仅集成Windows身份验证时,对Webservice的调用将导致根据需要进行日志记录。

但是,如果我更改Web客户端站点以允许匿名访问,则Webservice会尝试将结果记录在InvalidOperationException中。我忽略了它,但知道如何在Web服务中登录而不管它是如何被调用的将是很好的。这是我的一些代码:

   public FileService()
    {
        try
        {
            if (!EventLog.SourceExists(g_EventSource))
                EventLog.CreateEventSource(g_EventSource, g_EventLog);

            System.Security.Principal.WindowsIdentity UserIdentityInfo;
            UserIdentityInfo = System.Security.Principal.WindowsIdentity.GetCurrent();
            string AuthType = UserIdentityInfo.AuthenticationType;

    if (AuthType == "Kerberos")
    { engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials; }
    else
    { engineWSE.Credentials = new System.Net.NetworkCredential("u", "p", "domain"); }

    EventLog.WriteEntry(g_EventSource,
                "Caller: " + UserIdentityInfo.Name +
                " AuthType: " + UserIdentityInfo.AuthenticationType,
                EventLogEntryType.Information, 1);
        }
        catch (InvalidOperationException e)
        {
            // do nothing to ignore: "Cannot open log for source 'myAppSourceName'. You may not have write access." 
        }
    }

上面的构造函数中的示例在这里有点设计(我主要感兴趣的是能够写出与Web服务中的错误相关的信息)。

我希望有一种方法可以配置Web服务虚拟目录(或其中的代码),以便无论如何调用它都可以进行日志记录。

2 个答案:

答案 0 :(得分:3)

允许使用网络服务to write to the Event Log,但不能创建事件源。您可以授予HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\权限以允许它创建 - 但如果您已经在安装时创建了它,则没有必要。

它可能在SourceExists上失败 - 因为这需要枚举相同的注册表项。我可能只是删除SourceExists / Create检查并相信它就在那里 - 如果你是匿名的,你无论如何也无法创建它。

答案 1 :(得分:2)

您还应该检查您的web.config。

如果IIS设置为匿名,则web.config设置为windows / impersonate。然后,它将是尝试写入事件日志的匿名IIS用户。