web-dev-qa-db-ja.com

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

私はWCFサービスを完璧に機能させてきましたが、何かが変わったので何がわかりません。

私はこの例外が出ます:

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

私は.NET 4.0を実行しているので、これは紛らわしいです。

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

153
Trevor

.configファイルに behavior を定義します。

<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>

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

254
Otiel

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

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>
60
Rich O'Kelly

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

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

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

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

Immortal Blueは、実行の詳細を公にリリースされたバージョンに開示していないという点で正しいですが、テスト目的のためにこれは便利なツールです。リリースするときは常にオフにしてください。

24
LievenV

私は私の資格情報を使用して開発環境でそれを使用していたときにも、私は同じエラーを得ていた、WCFは私のために正しく働いていた私は多くの調査をし、それから設定の更新をする代わりに、フォルト例外の助けを借りて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
Aditya

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

<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" />

上記の方法で解決できない場合は、メインプロジェクトをここにアップロードしてみることができれば、さらに良い結果が得られるでしょう。それから私の側でテストをしたいのです。