В настоящее время я работаю над решением, которое должно использовать как Silverlight 3.0, так и стандартные приложения .NET в качестве клиентов для веб-службы, реализованной с помощью WCF. Части веб-службы, используемые клиентом Silverlight, нуждаются в дуплексной функциональности, поэтому я использую (все еще довольно новый) PollingDuplexBindingElement в одной конечной точке моего сервиса. Однако PDBE поддерживается только Silverlight, поэтому я добавил в свою службу вторую конечную точку для других клиентов, которая использует WSDualHttpBinding в качестве привязки. Этим другим клиентам на самом деле не нужен дуплекс, но поскольку части серверного контракта требуют дуплекса, стандартное симплексное связывание, такое как WSHttpBinding, не будет работать.
Из-за странных требований Silverlight WCF (например, переписывание ответов об ошибках HTTP 500 в HTTP 200 и т. Д.) Я инициализирую свой сервис с помощью пользовательского класса ServiceFactory, ключевые части которого выглядят следующим образом:
protected override void InitializeRuntime()
{
// Add the WSDualHttpBinding.
// This should listen at http://<servername>/RoomService.svc/wsdual
WSDualHttpBinding wsDualBinding = new WSDualHttpBinding(WSDualHttpSecurityMode.None)
{
MessageEncoding = WSMessageEncoding.Text,
TextEncoding = new System.Text.UTF8Encoding()
};
this.AddServiceEndpoint(
typeof(IRoomService),
wsDualBinding,
"wsdual");
// Add the PollingDuplexBinding
// This should listen at http://<servername>/RoomService.svc
PollingDuplexBindingElement pollingDuplexBindingElement = new PollingDuplexBindingElement()
{
// I'm not sure that these values are the best. They're an initial guess.
ServerPollTimeout = TimeSpan.FromSeconds(90),
InactivityTimeout = TimeSpan.FromMinutes(30)
};
CustomBinding pollingDuplexBinding = new CustomBinding(
pollingDuplexBindingElement,
new BinaryMessageEncodingBindingElement(),
new HttpTransportBindingElement());
this.AddServiceEndpoint(
typeof(IRoomService),
pollingDuplexBinding,
"").Behaviors.Add(new SilverlightFaultBehavior());
// Add the MetaData Exchange binding.
this.AddServiceEndpoint(
typeof(IMetadataExchange),
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
base.InitializeRuntime();
}
И (несколько удивительно) все работает. Все клиенты Silverlight / PollingDuplex получают свои аккуратные обратные вызовы (намного, намного лучше, чем SL 2.0!), И все клиенты .NET / WSDualHttp могут нормально общаться с сервером.
За исключением одного. Когда я пытаюсь отладить приложение, Visual Studio выдает следующее диалоговое окно, когда оно переходит к первому симплексному вызову через WSDualHttp:
"Невозможно автоматически отладить MyCompany.Service. Удаленная процедура не может быть отлажена. Обычно это означает, что отладка не была включена на веб-сервере. Дополнительную информацию см. В справке."
Сообщение об ошибке не является вполне точным. Оказывается, что вы можете выполнять пошаговую отладку в веб-сервисе с помощью любого duplex (одностороннего) вызова, но не с помощью любого simplex (двустороннего) вызова.
Теперь, конечно, я проверил, что мой web.config настроен правильно, то есть в нем есть следующая строка:
<compilation debug="true">
Я долго бился с этим, и я собрал довольно прямое воспроизведение (доступно здесь ), которое демонстрирует проблему. Насколько я могу судить, это проявляется, когда вы используете WSDualHttpBinding в IIS, а затем пытаетесь сделать стандартные симплексные вызовы для этой службы.
Мой первоначальный обходной путь состоял в том, чтобы отделить дуплекс от частей службы Simplex, после чего все работало просто отлично - но за счет дублирования объектных моделей на клиентах, которое было , а не идеально. Так что я вернул все обратно только к одному сервису, но, конечно, мне не хочется ничего отлаживать.
Кто-нибудь еще сталкивался с этим или есть какие-либо предложения?
FWIW, я более или менее опубликовал этот же вопрос на MSDN без предложений, и я попытался открыть ошибку с MS Connect , но снова с этого квартала помощи пока нет.
Есть идеи?