【问题标题】:WebBrower control is not navigating in self-hosted WCF service when called from WCF test client从 WCF 测试客户端调用时,WebBrowser 控件不在自托管 WCF 服务中导航
【发布时间】:2015-05-20 15:29:46
【问题描述】:

我在 WinForms 项目中托管了一个简单的 WCF 服务。我正在尝试更新 WebBrowser 控件以导航到服务接收到的指定 url。

namespace DocumentViewer
{
    public partial class FormMain : Form, IDocumentViewerService
    {
        private WfcServiceManager _service = new WfcServiceManager();

        public FormMain()
        {
            InitializeComponent();

            this.Load += FormMain_Load;
        }

        void FormMain_Load(object sender, EventArgs e)
        {
            _service.Start();

            webBrowser1.Navigate("http://www.example1.com");
        }

        public void ShowDocumentPreview(string path)
        {
            webBrowser1.Navigate("http://www.example2.com");
        }
    }
}

当应用加载成功时,它会按预期成功导航到 www.example1.com。

当我通过 WCF 测试客户端发送请求并在 ShowDocumentPreview(string path) 上放置断点时,该方法被命中,但 WebBrowser 控件未导航到 www.example2.com

有什么想法吗?

服务代码:

namespace DocumentViewer
{
    [ServiceContract]
    public interface IDocumentViewerService
    {
        [OperationContract]
        void ShowDocumentPreview(string path);
    }
}

namespace DocumentViewer
{
    public class WfcServiceManager
    {
        private Uri baseAddress = new Uri("http://localhost:30303/DocumentViewerService");

        private ServiceHost _host;

        public void Start()
        {
            _host = new ServiceHost(typeof(FormMain), baseAddress);

            // Enable metadata publishing.
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            _host.Description.Behaviors.Add(smb);

            _host.Open();
        }

        public void Stop()
        {
            if (_host != null)
            {
                _host.Close();
                _host = null;
            }
        }
    }
}

注意:我使用 WCF 的原因是因为 WebBrowser 控件是 32 位的,而我正在开发的主应用程序需要是 64 位的,所以我想出的解决方案是拥有一个单独的 32-带有 WebBrowser 控件的位应用程序和 64 位应用程序通过 WCF 将 url 发送到 WebBrowser 控件。

【问题讨论】:

  • 你确定UI的表单实例和服务的表单实例是一样的吗?您可以使用ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 将其强制为单例

标签: c# winforms wcf webbrowser-control 32bit-64bit


【解决方案1】:

首先,首先,在 WCF 服务中运行 WebBrowser 控件的实例并不是一个好主意。它不能很好地扩展并且具有安全隐患。 WebBrowser 控件从未用于服务器端。您可能想查看一些替代方案,例如 PhantonJS。

也就是说,如果您仍想在 WCF 服务环境(或只是控制台应用程序)中使用 WebBrowser,则需要在泵送 Windows 消息的 STA 线程内创建并运行 WebBrowser 的实例。目前您不这样做,这就是导航不起作用的原因。你可以从this related answer 使用我的MessageLoopApartment。

另请注意,WebBrowser 控件提供 32 位和 64 位版本,与 Internet Explorer 本身相同。将 .NET 编译为 64 位,将使用 64 位版本的 WebBrowser ActiveX 控件。

【讨论】:

  • 感谢您的详细回答,这使我重新调查了我们的原始问题,即当我们的应用程序在 64 位模式下运行时,pdf 无法在浏览器控件中打开。我们发现卸载 acrobat reader 并安装 acrobat reader 11 full install 然后运行更新到 11.0.10 可以解决问题,因此不再需要这种复杂的解决方法,这很棒!再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多