web-dev-qa-db-ja.com

WCFは障害状態のため、通信に使用できません

Webサービスを使用しようとすると、次の例外が発生します。私の主な質問は、いつこの例外が発生するのですか?サーバーまたはクライアント上で?エラーはどこですか?サーバーはこれを広範囲の障害に対してスローしますか?

私は自分でいくつかの変更を行いましたが、うまくいくようです

実際に動作します。を使用して削除し、サービスクライアントにsomクリーンアップを追加しました。

if (Service != null && Service.State != CommunicationState.Faulted)
                {
                    success = true;
                    Service.Close();
                }

            }
            catch (Exception ex)
            {
                msg = "Error" + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace;
            }
            finally{
                if (!success)
                {
                    if (Service != null) Service.Abort();
                }
            }

これは例外でした:

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 bNet.Services.Customers.Cres.Helios.ServiceForm.Send(ServiceFormAction task) in C:\bNetProjects\bNet Web Tools\Solution root\bNet.Services\Customers\Cres\Helios\ServiceForm.cs:line 99
at bNet.Web.Sites.Public.Customers.Cres.ServiceSkjema.Units.Page.ServiceFormControl.SubmitFormClick(Object sender, EventArgs e) in C:\bNetProjects\bNet Web Tools\Solution root\bNet.Web.Sites.Public\Customers\Cres\ServiceSkjema\Units\Page\ServiceFormControl.ascx.cs:line 192
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
11
espvar

障害状態は、サーバー側でnexpected例外が発生したことを意味します。以前の電話で。

クライアント側でも例外が発生しているはずですが、コードで無視されている可能性がありますか?

接続を再度開くことで解決できます。しかし、より良いエラー処理が必要なようです。

16
Henk Holterman

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

2
Ryan Rodemoyer

usingステートメントを使用する代わりに、それなしでコードを実行してみてください。

から

_using(var client = new WCFClient())
{
    // ... code
}
_

_var client = new WCFClient()

// ... code
_

これを実行すると、元のWCFはFaulted状態メッセージであるため、通信に使用できませんusing()自身を呼び出します。 理由?WCFクライアントを使用していたコードが無効な資格情報を渡していたため、サーバーがエラーで応答し、プロキシの状態を障害に変更しました。 using()ブロック ご存じのとおり は、オブジェクトに対してDispose()を呼び出します。この場合はWCFクライアントです。

WCFクライアントが失敗し、WCFクライアントが障害状態にあったため、Dispose()を呼び出すとエラーが発生しましたWCFは障害状態にあるため、通信に使用できませんスローされます。

これは、WCFクライアントを使用するコードを_try...catch_ブロックでラップすることで確認できました。

0
Zac