gpt4 book ai didi

WCF 仅跟踪失败的请求?

转载 作者:行者123 更新时间:2023-12-04 21:16:48 25 4
gpt4 key购买 nike

我想将跟踪信息保存到 .svclog 文件中,但仅用于失败的请求。这可能吗?如果是这样,如何精确?

我有一个每分钟调用数百次的 WCF 服务。在极少数情况下,客户端会收到错误 500,该错误发生在我在 WCF 内运行的代码边界之外(通常是安全问题)。我想确切地知道为什么会发生这些错误以及导致它们的原因。

我还非常想使用 Trace Viewer 工具来检查 .svclog 文件。

据我所知,我有两个选择:
1) 通过 system.webServer\tracing 设置记录失败的请求来检测 FERB 跟踪。不幸的是,我真的不喜欢 IE 跟踪查看器的界面,我也没有从跟踪日志中获得足够的信息来弄清楚为什么我的代码之外发生了错误。

2) 打开system.diagnostics\trace 部分下的全局跟踪。本节生成了很棒的跟踪日志,其中包含我可能想要的所有内容。但是,我找不到仅捕获失败请求信息的方法。此部分捕获所有请求的跟踪信息。我的跟踪日志很快就填满了!

我的错误 500 是间歇性的,而且很少见。最终,我希望始终开启 .svclog 跟踪,但仅在请求失败时才启动。

请建议这是否可能?

谢谢!

编辑:

格雷厄姆,
我遵循了您的建议,但没有看到我期望的日志。以下是 web.config 中的相关部分:

<system.diagnostics>
<trace>
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
<filter type="" />
</add>
</listeners>
</trace>

<sources>
<source name="System.ServiceModel" switchValue="Error">
<listeners>
<add name="wcfTracing"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="Traces1.svclog"/>
<add name="log4netTracing"
type="AzureWatch.Model.Service.Log4netTraceListener,AzureWatch.Model.Service"/>
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging" switchValue="Error">
<listeners>
<add name="wcfTracing"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="Traces2.svclog"/>
<!--<add name="log4netTracing"
type="AzureWatch.Model.Service.Log4netTraceListener,AzureWatch.Model.Service"/>-->
</listeners>
</source>
</sources>
</system.diagnostics>

<!-- ... -->

<diagnostics wmiProviderEnabled="true">

<messageLogging
logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"
maxSizeOfMessageToLog="1000000"
maxMessagesToLog="-1" />
</diagnostics>

这是 WCF 的客户端错误:
  <Exception>
<Type>System.Net.Sockets.SocketException</Type>
<Message>An existing connection was forcibly closed by the remote host</Message>
<StackTrace>
<Frame>at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)</Frame>
</StackTrace>
</Exception>

不幸的是,任何一个跟踪监听器都没有记录任何内容。
失败的请求日志包含以下内容:
-GENERAL_READ_ENTITY_END 
BytesReceived 0
ErrorCode 2147943395
ErrorCode The I/O operation has been aborted because of either a thread exit or an application request. (0x800703e3)
Warning
-MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName ManagedPipelineHandler
Notification 128
HttpStatus 400
HttpReason Bad Request
HttpSubStatus 0
ErrorCode 0
ConfigExceptionInfo
Notification EXECUTE_REQUEST_HANDLER
ErrorCode The operation completed successfully. (0x0)
0 msInformational

最佳答案

我已经尝试为我的 WCF 服务放入以下配置,并使用有效和无效的凭据访问该服务。只有具有无效凭据的请求才会导致服务跟踪文件中出现任何内容。我的服务使用自定义 UserNamePasswordValidator类,这出现在堆栈跟踪中。重要的部分是switchValue="Error"propagateActivity="false"<source>元素。不确定这是否正是您想要的,但至少看起来很接近......

<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Error"
propagateActivity="false">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="Default">
<filter type="" />
</add>
<add name="ServiceModelTraceListener">
<filter type="" />
</add>
</listeners>
</source>
</sources>
<sharedListeners>
<add initializeData="C:\Path-to-log-file\Web_tracelog.svclog"
type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="ServiceModelTraceListener"
traceOutputOptions="DateTime, Timestamp, Callstack">
<filter type="" />
</add>
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>

关于WCF 仅跟踪失败的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4222023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com