50

この例外が発生しています:

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

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

5 に答える 5

67

クライアント プロキシをusingブロックに配置することは避けてください。

于 2009-02-10T05:23:06.920 に答える
20

更新

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


元の投稿

これは、WCFクライアント呼び出しを処理するためのMicrosoftの推奨方法です。

詳細については、「予想される例外」を参照してください。

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

usingステートメントに関連する問題が非常に多いことを考えると(加熱されていますか?)この問題に関する内部の議論スレッドは、コードカウボーイになり、よりクリーンな方法を見つけるために時間を無駄にするつもりはありません。私はそれを吸い上げて、サーバーアプリケーション用にこの冗長な(まだ信頼できる)方法でWCFクライアントを実装します。

于 2011-02-19T04:36:36.003 に答える
7

転送モードがBufferedの場合は、 MaxReceivedMessageSizeMaxBufferSizeの値が同じであることを確認してください。何時間も取り組んだ後、この方法でフォルト状態の問題を解決したところです。

于 2014-04-24T02:38:45.740 に答える
1

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

于 2015-04-21T15:53:34.320 に答える
0

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

/Root/{Name}/{Name}
于 2016-04-13T19:07:10.347 に答える