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

标签 c# visual-studio web-services logging

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

承载此 WS 的虚拟目录不允许允许匿名访问,并且仅配置为集成 Windows 身份验证。

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

但是,如果我将 Web 客户端站点更改为允许匿名访问,则 Web 服务会尝试将结果记录在 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 服务虚拟目录(或其中的代码),以便无论如何调用它都可以进行日志记录。

最佳答案

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

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

关于c# - 当匿名用户调用时,Web 服务无法写入事件日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1168038/

相关文章:

c# - 获取数据网格中所选项目的行索引

c# - ASP.NET - 从 XML 文件读取本地化字符串的最佳做法是什么?

c# - 接口(interface)或实现它们的类的自定义属性?

c# - 清空 asp.net 资源缓存,由 SQLResourceProvider 提供

visual-studio - check out TFS 时的 .partial 文件

c++ - 它显示错误消息 Cannot create OCI environment in my Visual c++

c++ - 在 C++ 代码中使用 '$' 符号安全吗?

c# - 是否可以强制仅从已知客户端调用 Web 服务?

c# - 从 asp.net WebMethod 内部访问原始 JSON

c# - 使用 WCF 时创建工厂方法的最佳方法是什么?