Ответ 1
Следует избегать размещения клиентских прокси в блоках using
.
Я получаю это исключение:
Объект связи, 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();
}
Строка ошибки, показанная в сообщении, кажется, после последнего прокси. 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)
Следует избегать размещения клиентских прокси в блоках using
.
Обновление
Этот связанный ответ описывает более простой и простой способ сделать то же самое с синтаксисом С#.
Оригинальное сообщение
Это рекомендуемый Microsoft способ обработки вызовов клиентов WCF:
Подробнее см. Ожидаемые исключения
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\клиент
Учитывая, что существует так много проблем с использованием оператора using, (нагретый?) Внутренние обсуждения и темы по этой проблеме, я не собираюсь тратить свое время, пытаясь стать ковбой кода и найти более чистый способ. Я просто высасываю его и внедряю WCF-клиентам этот подробный (но надежный) способ для моих серверных приложений.
Если режим передачи Буферизованный, то убедитесь, что значения MaxReceivedMessageSize и MaxBufferSize одинаковы. Я просто разрешил проблему с государственным вопросом таким образом после того, как схватился за нее в течение нескольких часов и думал, что я отправлю ее здесь, если это кому-то поможет.
Эта ошибка также может быть вызвана нулевыми методами, отмеченными атрибутом OperationContract. Это была моя проблема при создании новой службы и ее долгое тестирование.
Как и ответ Райана Родемойера, я обнаружил, что, когда UriTemplate в Контракте недействителен, вы можете получить эту ошибку. В моем случае я дважды использовал один и тот же параметр. Например:
/Root/{Name}/{Name}