サーバーでIncludeExceptionDetailInFaultsをオンにします(ServiceBehaviorAttributeまたは<serviceDebug>構成動作から)。


157

私は完全に機能しているWCFサービスを使用していますが、何かが変更され、何がわかりません。

私はこの例外を受け取ります:

System.ServiceModel.FaultException:内部エラーのため、サーバーは要求を処理できませんでした。エラーの詳細については、サーバーでIncludeExceptionDetailInFaultsをオンにして(ServiceBehaviorAttributeまたは構成動作から)、例外情報をクライアントに送信するか、Microsoft .NET Framework 3.0 SDKのドキュメントに従ってトレースをオンにします。サーバートレースログを検査します。

.NET 4.0を実行しているため、これは混乱を招きます。

どこで電源を入れIncludeExceptionDetailInFaultsますか?私はそれを見つけるために戦っています。

回答:


264

ファイルで動作を定義し.configます。

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="debug">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    ...
  </system.serviceModel>
</configuration>

次に、これらの行に沿ってサービスに動作を適用します。

<configuration>
  <system.serviceModel>
    ...
    <services>
      <service name="MyServiceName" behaviorConfiguration="debug" />
    </services>
  </system.serviceModel>
</configuration>

プログラムで設定することもできます。この質問を参照してください。


1
こんにちはOtivel、私は私の場合、異なるサイトとサービスを含むネストされたフォルダがあります。サービスが存在し、エラーが発生するフォルダーは、メインのWebアプリケーションと比べて3番目のネストであり、サービスごとに専用のweb.configがあります。対応するweb.configを適宜変更して、<serviceDebug includeExceptionDetailInFaults = "true" />を追加します。しかし、まだエラーが発生します。完全なWebアプリケーションのすべてのweb.configを変更する必要がありますか?
MaxRecursion 2012年

2
@AkshayKulkarni:わかりません、私はあなたの事件の経験がありません。サービスがserviceBehaviorへの参照を持っていることを確認してください(gagograの回答を確認してください)。それでも問題が解決しない場合は、SOで質​​問してください。
Otiel、2012年

1
@MatthewLock:回答が更新されました。また、詳細が必要な場合は、<動作><サービス>を確認してください。
Otiel 2013

1
Visual Studioは、serviceBehaviorsをsystem.serviceModelの直接の子にすることはできないことを教えてくれます。結局はrich.okellyの答えになりました。
andrewb 2013

3
注:VS2013は<serviceDebug>タグをデフォルトのWeb.configに配置し、falseに設定します。私が気づかなかったように気づかず、上記のXMLを追加した場合は、ファイルの最後にあるものが明らかに優先されます。これが誰かに役立つことを願っています。
ジェフ

63

app.configファイルにあります。

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>

9
すべてのサービスに適用する場合は、<behavior>の名前属性(@Otielの回答のように)を設定しないでください。
Pashec、2016年

47

コードでこれを行う場合は、次のような動作を追加できます。

serviceHost.Description.Behaviors.Remove(
    typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
    new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });

これをServiceHostオブジェクトインスタンスに追加します。例:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
ダニエル

28

インターフェースを継承するクラス宣言の上の[ServiceBehavior]タグで設定することもできます

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyClass:IMyService
{
...
}

Immortal Blueは、例外の詳細を公開されているバージョンに公開しないという点で正しいですが、テスト目的では、これは便利なツールです。離すときは、必ず電源を切ってください。


私はこれをバックエンドで実行するアプリケーションで使用し、公開されることはないため、これは完全に機能します
AlbatrossCafe

4

私も同じエラーが発生しました。資格情報を使用してDev EnvironmentでWCFを使用すると、WCFは適切に機能しましたが、他の誰かがTESTで使用すると、同じエラーがスローされました。私は多くの調査を行い、構成の更新を行う代わりに、障害例外を利用してWCFメソッドで例外を処理しました。また、WCFのIDには、データベースでアクセスできるのと同じ資格情報を設定する必要があります。誰かがあなたの権限を変更した可能性があります。以下のコードを見つけてください:

 [ServiceContract]
public interface IService1
{
    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    ForDataset GetCCDBdata();

    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    string GetCCDBdataasXMLstring();


    //[OperationContract]
    //string GetData(int value);

    //[OperationContract]
    //CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}

  [DataContract]
public class ServiceData
{
    [DataMember]
    public bool Result { get; set; }
    [DataMember]
    public string ErrorMessage { get; set; }
    [DataMember]
    public string ErrorDetails { get; set; }
}

service1.svc.csでは、これをcatchブロックで使用できます。

 catch (Exception ex)
        {
            myServiceData.Result = false;
            myServiceData.ErrorMessage = "unforeseen error occured. Please try later.";
            myServiceData.ErrorDetails = ex.ToString();
            throw new FaultException<ServiceData>(myServiceData, ex.ToString());
        }

そして、以下のコードのようなクライアントアプリケーションでこれを使用してください:

  ConsoleApplicationWCFClient.CCDB_HIG_service.ForDataset ds = obj.GetCCDBdata();

            string str = obj.GetCCDBdataasXMLstring();

        }

        catch (FaultException<ConsoleApplicationWCFClient.CCDB_HIG_service.ServiceData> Fex)
      {
          Console.WriteLine("ErrorMessage::" + Fex.Detail.ErrorMessage + Environment.NewLine);
          Console.WriteLine("ErrorDetails::" + Environment.NewLine + Fex.Detail.ErrorDetails);
          Console.ReadLine();
      }

これを試してみてください、それは確実に正確な問題を取得するのに役立ちます。


4
根本的な例外の詳細を公開しないでください。クライアントとサーバーの間で例外を分離し、このフラグを必要とする目的は、クライアントが例外情報を利用できるようにすることです。悪意のあるユーザーがこの情報を使用してサービスを操作する可能性があります!開発中の場合は、記述どおりの動作IncludeExceptionDetailInFaultsを使用して例外全体を伝播するか、デプロイメントで、スタックトレースとスタックの完全な詳細を提供するのではなく、「ファイルを保存できません」などの非常に基本的なエラーを生成するfaultexceptionを発生させます。例外。
イモータルブルー

こんにちは..私の場合、ファイルを保存するために使用している関数によって他のすべてのサービス関数が呼び出されて例外がスローされています...ログシステムを使用した正確な問題を知るために、そのメソッドのログは作成されません... 3つのログを作成する1)サービスがヒットしたとき2)ファイルを保存する前に3)例外ログ。
user3217843

0

エラー情報が最初に言ったので、次のようにクライアント側とサービス側の両方でタイムアウト値を増やしてみてください:

<basicHttpBinding>
    <binding name="basicHttpBinding_ACRMS" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647"
      openTimeout="00:20:00" 
      receiveTimeout="00:20:00" closeTimeout="00:20:00"
      sendTimeout="00:20:00">
      <readerQuotas maxDepth="32" maxStringContentLength="2097152"
        maxArrayLength="2097152" maxBytesPerRead="4006" maxNameTableCharCount="16384" />
    </binding>

次に、以下を実行して、このバインディング構成をエンドポイントに適用することを忘れないでください。

<endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="basicHttpBinding_ACRMS"
      contract="MonitorRAM.IService1" />

上記の方法で問題が解決しない場合は、ここでメインプロジェクトをアップロードしてみてください。私の側でテストを行いたいと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.