WCF нельзя использовать для связи, потому что он находится в состоянии Failed - PullRequest
10 голосов
/ 23 февраля 2012

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

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

Это на самом деле работает сейчасЯ удалил с помощью и добавил som 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)

Ответы [ 3 ]

15 голосов
/ 23 февраля 2012

Состояние ошибки означает, что на стороне сервера возникла исключительная ситуация неожиданное .В более раннем звонке.

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

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

2 голосов
/ 21 апреля 2015

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

0 голосов
/ 16 апреля 2019

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

С

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

до

var client = new WCFClient()

// ... code

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...