web-dev-qa-db-ja.com

IIS)のWCFサービスで機能しない詳細なエラー

Web.configファイルを変更してエラーが発生した場合、標準の500-内部サーバーページのみが表示されます。

エラーページモードを詳細に設定しているのに、詳細なエラーメッセージが表示されません。これを並べ替えるにはどうすればよいですか?

その理由は、トレースを追加するためにWCFサービスに変更を加えたいのですが、500エラーが発生するため、この500エラーが何であるかを確認したいと思います。

Web.configファイルに次のものがあります。

<system.webServer>
    <httpErrors errorMode="Detailed" />
...
</system.webServer>

<system.web>
    <customErrors mode="Off" />
...
</system.web>
2
Marcus

WCFトレースは、IIS Webサイトの通常のweb.config設定よりも構成が複雑になる可能性があります。

情報をクライアントに返す場合(開発でのみ行う必要があります)、includeExceptionDetailInFaults設定を試してください。

_  <system.serviceModel>
    <serviceBehaviors>
      <behavior name="metadataAndDebugEnabled">
        <serviceDebug
          includeExceptionDetailInFaults="true" />
        <serviceMetadata
          httpGetEnabled="true"
          httpGetUrl="" />
      </behavior>
    </serviceBehaviors>
  </system.serviceModel>
_

http://msdn.Microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.includeexceptiondetailinfaults.aspx

ただし、はるかに便利なツールは、Service TraceViewerアプリケーションで処理できるファイルへのトレースです。これは通常、Windows開発SDKがインストールされているマシンのC:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\svctraceviewer.exeにあります。

トレースの構成
http://msdn.Microsoft.com/en-us/library/ms733025.aspx

サービストレースビューアツール(SvcTraceViewer.exe)
http://msdn.Microsoft.com/en-us/library/ms732023.aspx

トランスポートレベルのアクティビティをログに記録できます。メッセージセキュリティがある場合は、メッセージアクティビティをログに記録できます。通常、それぞれに個別のファイルが作成されます。構成する1つの方法の例:

_<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には優れたフィルタリングがあります。例外は、左側のペインで赤で強調表示されて表示されます。例外をクリックすると、例外の詳細を見つけることができます。

enter image description here

1
Greg Askew

machine.config ファイルでretailモードオプションがtrueに設定されていないことを確認してください。

これは次のようになります。

<configuration>
    <system.web>
          <deployment retail=”true”/>
    </system.web>
</configuration>

これをtrueに設定すると、デバッグと要求トレースが無効になり、カスタムエラーが常にオンになります。 falseに設定します。

ランタイム環境で使用されているmachine.configへのパスを取得するには、次のようにASP.NETで出力します。

<%
string machineConfPath = 
  System.Runtime.InteropServices.RuntimeEnvironment.SystemConfigurationFile;
Response.Write("System configuration file: {0}", machineConfPath);
%>
0