摘要:如何配置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服务虚拟目录(或其中的代码),以便无论如何调用它都可以进行日志记录。
答案 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用户。