IIS 7 日志记录 Web 服务方法

Posted

技术标签:

【中文标题】IIS 7 日志记录 Web 服务方法【英文标题】:IIS 7 Logging Web Service methods 【发布时间】:2012-01-24 18:44:51 【问题描述】:

我有一个托管在 IIS 7 下的 Web 服务(不是 WCF 服务),该 Web 服务有两种方法:method1 和 method2。

我希望在不修改 Web 服务代码的情况下区分对方法 1 的请求和对方法 2 的请求。

在 IIS 7 日志下,我可以看到对 Web 服务的请求,Web 服务 URL 记录在“cs-uri-stem”字段下,但“cs-uri-query”字段为空。

是否可以在不修改网络服务代码的情况下记录网络服务方法的请求?

【问题讨论】:

您对 ASMX 的限制非常有限。您应该转移到 WCF,这很容易。 如何使用 WCF 做到这一点?这可能对我有帮助,ASMX 服务调用 WCF 服务,我可以访问 IIS 和托管 WCF 的机器。 只需开启WCF Tracing。 【参考方案1】:

您可以在处理管道的各种方法中记录所有传入请求。例如,在您的Global.asax 中添加BeginRequest 的处理程序:

Application_BeginRequest( object sender, EventArgs e )

    HttpApplication app = (HttpApplication)sender;
    HttpContext ctx = app.Context;

    var requestUrl = ctx.Request.Url;

    // the uri should be of a form:
    // http://yoursite/theservice.asmx/MethodName

【讨论】:

我不想修改应用程序代码,应用程序已经在生产环境中运行了……不知道从IIS层面有没有办法这样做!【参考方案2】:

多年后,我不得不访问具有数百种方法的 ASMX,但无法转换为 WCF。这是一个 ASMX 扩展点,它允许您在不访问所有方法的情况下记录方法名称。在这里,我使用 log4net 来记录方法名称,YMMV

首先,创建一个 SoapExtension 类:

namespace MyNamespace 
    public class WebMethodLogger : SoapExtension
    
        private static readonly ILog _log = LogManager.GetLogger(typeof(WebMethodLogger));

        public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
        
            return null; //No state
        

        public override object GetInitializer(Type serviceType)
        
            return null; //No state
        

        public override void Initialize(object initializer)
        
            //Do nothing
        

        public override void ProcessMessage(SoapMessage message)
        
            if (message.Stage == SoapMessageStage.AfterDeserialize)
                _log.Debug(message.MethodInfo.MethodInfo.Name);
        
    

然后,在您的 web.config 中注册扩展:

<system.web>
...
    <webServices>
        <soapExtensionTypes>
            <add type="MyNamespace.WebMethodLogger, MyAssembly"
                 priority="1"
                 group="High" />
        </soapExtensionTypes>
    </webServices>
...
</system.web>

【讨论】:

【参考方案3】:

这是来自微软的官方文章: http://support.microsoft.com/kb/313437

1- 启动 Internet 信息服务 (IIS) 管理器。

2- 展开 ServerName,然后展开 Web 站点或 FTP 站点。右键单击要启用日志记录的网站或 FTP 站点,然后单击“属性”。

3- 单击网站选项卡,或单击 FTP 站点选项卡。

4- 单击以选中启用日志记录复选框。

5- 在活动日志格式框中,单击您要使用的格式。

6- 单击属性,然后指定所需的设置。例如,如果您使用 W3C 扩展日志文件格式,请按照以下步骤操作:

一个。如果您正在运行 IIS 6.0,请单击“常规”选项卡。如果您运行的是 IIS 5.0 或 IIS 4.0,请单击“常规属性”选项卡。指定要用于创建新日志文件的计划。例如,要每天创建一个新的日志文件,请单击 Daily。

b.如果要使用本地时间,请单击以选中“使用本地时间进行文件命名和翻转”复选框。

注意午夜本地时间用于除 W3C 扩展日志文件格式之外的所有日志文件格式。默认情况下,W3C 扩展日志文件格式使用协调世界时(格林威治标准时间)的午夜。要使用本地时间午夜,请单击以选中“使用本地时间进行文件命名和翻转”复选框。

c。如果您运行的是 IIS 6.0,请单击“高级”选项卡。如果您运行的是 IIS 5.0 或 IIS 4.0,请单击扩展属性选项卡。

d。指定所需的选项。例如,指定“自定义数据”部分中列出的属性。点击确定。

e。点击确定。

【讨论】:

我在这些日志中没有看到 Web 服务调用,也没有看到错误...

以上是关于IIS 7 日志记录 Web 服务方法的主要内容,如果未能解决你的问题,请参考以下文章

在Windows7上配置管理IIS日志记录

怎样查看IIS日志记录?

F5负载的应用IIS日志记录的不是真实IP的处理方法

在Windows Server 中IIS6.0配置网站日志记录

PHP错误日志记录文件位置确定

X-Forwarded-For (IIS日志记录用户真实IP)