Сообщение об ошибке с WCF WSDualHttpBinding: невозможно автоматически отладить службу - PullRequest
0 голосов
/ 12 июля 2009

В настоящее время я работаю над решением, которое должно использовать как 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 , но снова с этого квартала помощи пока нет.

Есть идеи?

1 Ответ

0 голосов
/ 28 августа 2009

Оказывается, это добросовестная ошибка. Это должно быть исправлено в VS 2010 Beta 2.

Смотрите здесь: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=472536&wa=wsignin1.0.

...