web-dev-qa-db-ja.com

WCF Faulted状態の例外が発生しないようにする方法は?

私はこの例外を受け取っています:

通信オブジェクトSystem.ServiceModel.Channels.ServiceChannelは、障害状態にあるため、通信に使用できません。

WCFサービスはデフォルトのwsHttpBindingを使用します。私はそれを使用しているところはどこでも次の方法でWCFを使用しています:

using (var proxy = new CAGDashboardServiceClient())
{
    proxy.Open();
    var result = proxy.GetSiteForRegion(ddlRegions.SelectedValue);
    ddlSites.DataSource = result;
    ddlSites.DataBind();
    proxy.Close();
}

メッセージに表示されるエラー行は、最後のproxy.closeの後にあるようです。何が起こっているのか分かりません。 Visual Studio 08内からサービスを開始しています。

トレース情報は次のとおりです。

The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.

Server stack trace: 
  at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout)

Exception rethrown at [0]: 
  at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(iMessage reqMsg, iMessage retMsg)
  at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
  at System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)
  at System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)
  at System.ServiceModel.ClientBase`1.Close()
  at System.ServiceModel.ClientBase`1.System.IDisposable.Dispose()
  at CAGDashboard.UserControls.ucVolunteerCRUDGrid.ddlRegions_SelectedIndexChanged(Object sender, EventArgs e) in C:\Documents and Settings\rballalx\My Documents\Visual Studio 2008\Projects\DashboardCAG\CAGDashboard\UserControls\ucVolunteerCRUDGrid.ascx.cs:line 81
  at System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
  at System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent()
  at System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
  at System.Web.UI.Page.RaiseChangedEvents()
  at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
49
Perpetualcoder
65
Brian

更新

この リンクされた答えは、C#構文で同じことを行うより簡潔で簡単な方法を説明しています。


元の投稿

これは、WCFクライアントコールを処理するMicrosoftの推奨方法です。

詳細については、以下を参照してください: Expected Exceptions

try
{
    ...
    double result = client.Add(value1, value2);
    ...
    client.Close();
}
catch (TimeoutException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}
catch (CommunicationException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}

追加情報

多くの人がWCFでこの質問をしているようで、Microsoftは例外を処理する方法を示す専用のサンプルを作成しました。

c:\ WF_WCF_Samples\WCF\Basic\Client\ExpectedExceptions\CS\client

サンプルをダウンロードします。 C# または [〜#〜] vb [〜#〜]

この問題については非常に多くの問題があることを考慮して singステートメントを含む(heated?)内部議論 および threads 、私は行かないコードカウボーイになろうとして私の時間を無駄にして、よりクリーンな方法を見つけるために。私はそれを吸い込み、WCFクライアントをこの冗長な(まだ信頼できる)方法でサーバーアプリケーションに実装します。

20

転送モードがBufferedの場合、MaxReceivedMessageSizeおよびMaxBufferSizeの値が同じであることを確認します。何時間も取り組んだ後、このようにして障害状態の問題を解決し、誰かに役立つ場合はここに投稿すると思いました。

5
Nishant

このエラーは、OperationContract属性でタグ付けされたメソッドがゼロであることによっても発生する可能性があります。これは、新しいサービスを構築し、それをずっとテストするときの私の問題でした。

1
Ryan Rodemoyer

Ryan Rodemoyerの答えと同様に、契約のUriTemplateが有効でない場合、このエラーが発生することがあります。私の場合、同じパラメーターを2回使用していました。例えば:

/Root/{Name}/{Name}
0
Gil Milow