0

我目前正在研究一种解决方案,该解决方案需要同时使用 Silverlight 3.0 和标准 .NET 应用程序作为使用 WCF 实现的 Web 服务的客户端。Silverlight 客户端使用的 Web 服务部分需要双工功能,因此我在服务的一个端点上使用(仍然相当新的)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'。无法调试远程过程。这通常表示 Web 服务器上尚未启用调试。有关详细信息,请参阅帮助。”

错误消息不是准确。事实证明,您可以通过任何双工(单向)调用对 Web 服务进行逐步调试,但不能通过任何单工(双向)调用。

现在,当然,我已经检查以确认我的 web.config 设置正确,即其中包含以下行:

<compilation debug="true">

我一直在反对这个问题足够长的时间,以至于我整理了一个相当简单的复制品(可在此处获得)来证明这个问题。据我所知,当您在 IIS 中使用 WSDualHttpBinding,然后尝试对该服务进行标准单工调用时,它就会出现。

我最初的解决方法是将 Duplex 从服务的 Simplex 部分中分离出来,此时一切正常——但代价是客户端上的对象模型重复,这并不理想。所以我把所有东西都移回了一个服务,但不能调试任何东西肯定是一件痛苦的事。

有没有其他人遇到过这个问题,或者有什么建议?

FWIW,我在MSDN上或多或少地发布了同样的问题,没有任何建议,并且我尝试使用 MS Connect打开一个错误,但同样,该季度还没有任何帮助。

有任何想法吗?

4

1 回答 1

0

原来这是一个真正的错误。它应该在 VS 2010 Beta 2 中修复。

看这里:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=472536&wa=wsignin1.0

于 2009-08-27T23:31:22.713 回答