webservices跟踪/日志

时间:2011-01-08 03:07:42

标签: c# web-services logging asmx trace

我有一组Web服务,我想添加一个跟踪图层。 我不想修改每个Web服务,因为我有很多。 我想在每次进入Web服务时写入日志:Web服务名称和参数。

最好的方法是什么?

P.S。我正在使用asp.net和C#。

编辑: 我只想包装Web服务,因为每个人都会在开头有一个log(..)。

7 个答案:

答案 0 :(得分:6)

实现此目的的常用方法是注入SOAP扩展。从那里,您可以拦截原始SOAP中的每个请求/响应数据包。该示例显示了如何实现一个,解释说明了它的工作原理以及如何配置它。

样品:

http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapextension.aspx

说明:

http://msdn.microsoft.com/en-us/library/esw638yk(vs.71).aspx

配置:

http://msdn.microsoft.com/en-us/library/b5e8e7kk(v=vs.71).aspx

<configuration>
 <system.web>
   <webServices>
     <soapExtensionTypes>
      <add type="{Type name}, {Assembly}" priority="1" group="0" />
     </soapExtensionTypes>
    </webServices>
 </system.web>
</configuration>

答案 1 :(得分:1)

将全局应用程序类 Global.asax 文件添加到项目中,并将日志记录逻辑添加到Application_BeginRequest()方法。 sender 对象将包含HTTP请求和参数。您可以仅过滤.asmx请求并记录这些请求。

    protected void Application_BeginRequest(object sender, EventArgs e)
    {

    }

答案 2 :(得分:1)

EDIT--
试试PostSharp吧。这是获得此功能的最简单方法。对于后代,我将在下面留下我的帖子,但忽略它并使用PostSharp。


如果您的网络服务是WCF,那么您应该查看http://msdn.microsoft.com/en-us/magazine/cc163302.aspx

在整个过程中的每一步,它们都提供了可插入的扩展点。您可以使用这些扩展点来实现各种自定义行为,包括消息或参数验证,消息记录,消息转换。

毫无疑问,这是WCF服务的方法。否则,如果它们只是Web服务,那么你可以使用Unity框架和hookup以及Interceptor来做同样的事情。

答案 3 :(得分:0)

我维护一个Open source web services framework,让您只需通过让所有Web服务从基类继承并进行自己的日志记录来实现此目的。

这是一个example of a base-class,我为redis中的所有异常维护一个分布式滚动日志 - 一个非常快的NoSQL数据存储:

public object Execute(TRequest request)
{
    try
    {
        //Run the request in a managed scope serializing all 
        return Run(request);
    }
    catch (Exception ex)
    {
        return HandleException(request, ex);
    }
}

protected object HandleException(TRequest request, Exception ex)
{
    var responseStatus = ResponseStatusTranslator.Instance.Parse(ex);

    if (EndpointHost.UserConfig.DebugMode)
    {
        // View stack trace in tests and on the client
        responseStatus.StackTrace = GetRequestErrorBody() + ex;
    }

    Log.Error("ServiceBase<TRequest>::Service Exception", ex);

    //If Redis is configured, maintain rolling service error logs in Redis (an in-memory datastore)
    var redisManager = TryResolve<IRedisClientsManager>();
    if (redisManager != null)
    {
        try
        {
            //Get a thread-safe redis client from the client manager pool
            using (var client = redisManager.GetClient())
            {
                //Get a client with a native interface for storing 'ResponseStatus' objects
                var redis = client.GetTypedClient<ResponseStatus>();

                //Store the errors in predictable Redis-named lists i.e. 
                //'urn:ServiceErrors:{ServiceName}' and 'urn:ServiceErrors:All' 
                var redisSeriviceErrorList = redis.Lists[UrnId.Create(UrnServiceErrorType, ServiceName)];
                var redisCombinedErrorList = redis.Lists[UrnId.Create(UrnServiceErrorType, CombinedServiceLogId)];

                //Append the error at the start of the service-specific and combined error logs.
                redisSeriviceErrorList.Prepend(responseStatus);
                redisCombinedErrorList.Prepend(responseStatus);

                //Clip old error logs from the managed logs
                const int rollingErrorCount = 1000;
                redisSeriviceErrorList.Trim(0, rollingErrorCount);
                redisCombinedErrorList.Trim(0, rollingErrorCount);
            }
        }
        catch (Exception suppressRedisException)
        {
            Log.Error("Could not append exception to redis service error logs", suppressRedisException);
        }
    }

    var responseDto = CreateResponseDto(request, responseStatus);

    if (responseDto == null)
    {
        throw ex;
    }

    return new HttpResult(responseDto, null, HttpStatusCode.InternalServerError);
}

否则,对于普通的ASP.NET Web服务框架,我会查看Global.asax事件,特别是每次发出新请求时触发的“Application_BeginRequest”事件。

答案 4 :(得分:0)

如果编程语言不重要,您可以将Apache Synapse作为代理放在您的服务之前。然后,您的客户将请求发送给Synapse,Synapse会将请求委托给您的原始服务。可以将代理配置为对两者之间的请求执行某些操作,例如记录。

请参阅以下链接以获取更多信息:

http://synapse.apache.org/Synapse_Configuration_Language.html#proxy
http://synapse.apache.org/Synapse_Configuration_Language.html#send
http://synapse.apache.org/Synapse_Configuration_Language.html#log

以下示例的组合可能适合您:

http://synapse.apache.org/Synapse_Samples.html#Sample0
http://synapse.apache.org/Synapse_Samples.html#ProxyServices

e.g:

<definitions xmlns="http://ws.apache.org/ns/synapse"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://ws.apache.org/ns/synapse http://synapse.apache.org/ns/2010/04/configuration/synapse_config.xsd">

<proxy name="StockQuoteProxy">
    <target>
        <endpoint>
            <address uri="http://localhost:9000/services/SimpleStockQuoteService"/>
        </endpoint>
        <outSequence>
            <!-- log all attributes of messages passing through -->
            <log level="full"/>

            <!-- Send the message to implicit destination -->
            <send/>
        </outSequence>
    </target>
    <publishWSDL uri="file:repository/conf/sample/resources/proxy/sample_proxy_1.wsdl"/>
</proxy>

答案 5 :(得分:0)

writing your own HttpModule怎么样?这将无需触及现有的Web服务代码。您只需将模块添加到每个web.config文件中。

答案 6 :(得分:-1)

我不知道这是否是您要找的,只需在“

之后将此添加到您的WCF配置文件中

它将创建非常广泛的日志记录,您可以使用Microsoft服务跟踪查看器

进行阅读
<system.diagnostics>
  <sources>
   <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
    <listeners>
     <add type="System.Diagnostics.DefaultTraceListener" name="Default">
      <filter type="" />
     </add>
     <add name="ServiceModelMessageLoggingListener">
      <filter type="" />
     </add>
    </listeners>
   </source>
   <source name="System.ServiceModel" switchValue="Warning, ActivityTracing"
    propagateActivity="true">
    <listeners>
     <add type="System.Diagnostics.DefaultTraceListener" name="Default">
      <filter type="" />
     </add>
     <add name="ServiceModelTraceListener">
      <filter type="" />
     </add>
    </listeners>
   </source>
  </sources>
  <sharedListeners>
   <add initializeData="C:\ServiceLog.svclog"
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
    <filter type="" />
   </add>
   <add initializeData="C:\Tracelog.svclog"
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
    <filter type="" />
   </add>
  </sharedListeners>
 </system.diagnostics>