Подробные ошибки не работают для службы WCF в IIS
Если бы я изменил файл web.config, чтобы в нем были ошибки, я вижу только стандартную страницу 500 - Internal Server Page.
Несмотря на то, что для режима "Страницы ошибок" установлено значение "Подробно", подробное сообщение об ошибке не отображается. Как мне это отсортировать?
Причина в том, что я хочу внести изменения в службу WCF, чтобы добавить трассировку, но это дает ошибку 500, поэтому я хочу посмотреть, что это за ошибка 500.
У меня есть следующее в файле web.config:
<system.webServer>
<httpErrors errorMode="Detailed" />
...
</system.webServer>
<system.web>
<customErrors mode="Off" />
...
</system.web>
2 ответа
Трассировка WCF может быть более сложной для настройки, чем обычные параметры web.config для веб-сайта IIS.
Если вы хотите, чтобы информация возвращалась клиенту (что следует делать только при разработке), попробуйте параметр includeExceptionDetailInFaults:
<system.serviceModel>
<serviceBehaviors>
<behavior name="metadataAndDebugEnabled">
<serviceDebug
includeExceptionDetailInFaults="true" />
<serviceMetadata
httpGetEnabled="true"
httpGetUrl="" />
</behavior>
</serviceBehaviors>
</system.serviceModel>
Однако гораздо более полезным инструментом является отслеживание файла, который можно обработать с помощью приложения Viewer Trace Viewer. Обычно это находится по адресу: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\svctraceviewer.exe
на вашем компьютере, где установлен Windows Development SDK.
Настройка трассировки
http://msdn.microsoft.com/en-us/library/ms733025.aspx
Средство просмотра служебных трассировок (SvcTraceViewer.exe)
http://msdn.microsoft.com/en-us/library/ms732023.aspx
Вы можете регистрировать активность на транспортном уровне и, если у вас есть безопасность сообщений, активность сообщений. Обычно для каждого создается отдельный файл. Пример одного способа настройки:
<system.diagnostics>
<sources>
<!-- NOTE: change to switchValue="Warning" for production -->
<!--source name="System.ServiceModel" switchValue="Warning" propagateActivity="true"-->
<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>
<!-- NOTE: change to switchValue="Warning" for production -->
<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>
</sources>
<sharedListeners>
<add initializeData="C:\logs\app_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
<filter type=""/>
</add>
<add initializeData="C:\logs\app_messages.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
<filter type=""/>
</add>
</sharedListeners>
</system.diagnostics>
Если все настроено правильно, файлы будут сгенерированы. Когда возникает исключение, вы можете скопировать файл на компьютер, на котором установлен svctraceviewer, и открыть его. Обычно вы можете перейти к дате и времени, когда проблема возникла, и найти ее. Если вы просматриваете много активности, svctraceviewer имеет отличную фильтрацию. На левой панели исключения отображаются красным цветом. Вы можете нажать на исключение, чтобы найти подробности исключения.
Убедитесь, что retail
опция режима не установлена на true
в файле machine.config.
Это будет выглядеть примерно так:
<configuration>
<system.web>
<deployment retail=”true”/>
</system.web>
</configuration>
Если для этого параметра установлено значение true, отладка и отслеживание запросов будут отключены, а пользовательские ошибки всегда будут включены. Установите это в ложь.
Чтобы получить путь к machine.config, который используется средой выполнения, распечатайте его в ASP.NET следующим образом:
<%
string machineConfPath =
System.Runtime.InteropServices.RuntimeEnvironment.SystemConfigurationFile;
Response.Write("System configuration file: {0}", machineConfPath);
%>