WCF Не может использоваться для связи, поскольку он находится в состоянии Faulted

Когда я пытаюсь использовать веб-сервис, я получаю следующее исключение. Мой главный вопрос: когда это исключение происходит? на сервере или клиенте? где ошибка? Сервер бросает это для широкого диапазона ошибок?

Я сделал некоторые изменения самостоятельно, которые, кажется, работают

Сейчас он работает. Я удалил использование и добавил sm cleanup на клиенте службы.

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)

Ответ 1

Неисправное состояние означает, что на стороне сервера было неожиданное исключение. В предыдущем звонке.

Вы также должны были получить исключение на стороне клиента, возможно, ваш код игнорирует его?

Вы можете решить эту проблему, открыв соединение. Но, похоже, вам нужна более эффективная обработка ошибок.

Ответ 2

Эта ошибка также может быть вызвана нулевыми методами, отмеченными атрибутом OperationContract. Это была моя проблема при создании новой службы и ее долгое тестирование.

Ответ 3

Вместо использования оператора using попробуйте запустить свой код без него.

От

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

в

var client = new WCFClient()

// ... code

Сделав это, мы увидели, что исходный WCF не может быть использован для связи, потому что он находится в сообщении "Сбой", что было вызвано самим вызовом using(). Зачем? Наш код, который использовал клиент WCF, передавал неверные учетные данные, и сервер ответил с ошибкой и изменил состояние прокси на сбойное. Блок using(), как мы знаем, вызывает Dispose() для объекта - в данном случае наш клиент WCF.

Поскольку клиент WCF завершился ошибкой, а клиент WCF находился в состоянии сбоя, вызов Dispose() вызвал ошибку, которую WCF нельзя использовать для связи, поскольку он находится в состоянии Failed для выброса.

Мы смогли увидеть это, обернув код, который использует клиент WCF, в блок try...catch.