【问题标题】:EndpointNotFoundException in WCF + NamedPipes hosted in Windows FormsWCF 中的 EndpointNotFoundException + Windows 窗体中托管的 NamedPipes
【发布时间】:2014-12-01 16:48:16
【问题描述】:

我创建了一个简单的代码来允许使用 WCF 和 NamedPipes 进行跨应用程序域通信。我正在我的 Windows 8.1 上测试代码,它导致了 EndpointNotFoundException。

这是我的代码:

服务合同

[ServiceContract(Namespace = "http://PoC.AppDomainWCF")]
    public interface ICrossAppDomainSvc
    {
        [OperationContract]
        bool HasPermission(String User, String Permission);
    }

Program.cs (WinForms)

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Thread thread = new Thread(new ThreadStart(StartService));
            thread.Start();

            Application.Run(new Form1());
        }

        static void StartService()
        {
            using (ServiceHost host = new ServiceHost(typeof(CrossAppDomainSvc), new Uri[] {
                new Uri("http://localhost:12000/AppDomainWCF/"),
                new Uri("net.pipe://localhost/")
            }))
            {
                var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
                host.AddServiceEndpoint(typeof(ICrossAppDomainSvc), binding, "CrossAppDomainSvc");

                // Add a MEX endpoint
                //ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
                //metadataBehavior.HttpGetEnabled = true;
                //metadataBehavior.HttpGetUrl = new Uri("http://localhost:12001/AppDomainWCF");
                //host.Description.Behaviors.Add(metadataBehavior);

                host.Open();

            }
        }
    }

客户端代码

NetNamedPipeBinding binding = new NetNamedPipeBinding();
            ChannelFactory<ICrossAppDomainSvc> channelFactory = new ChannelFactory<ICrossAppDomainSvc>(binding);

            EndpointAddress endpointAddress = new EndpointAddress("net.pipe://localhost/CrossAppDomainSvc");

            ICrossAppDomainSvc service = channelFactory.CreateChannel(endpointAddress);

            MessageBox.Show(service.HasPermission("Juliano", "XPTO").ToString());

在 service.HasPermission 调用时抛出异常。

我的代码有什么问题?

更新

由于问题已经得到解答并且我的概念验证正在运行,我在 GitHub 上创建了一个存储库,以帮助任何需要允许跨应用程序域通信的人。

CrossAppDomainWCF sample code

【问题讨论】:

  • 服务器net.pipe://localhost/中的端点地址必须与客户端net.pipe://localhost/CrossAppDomainSvc匹配。
  • 这只是基地址。如果我使用相同的地址,我会得到相同的错误。

标签: c# wcf named-pipes


【解决方案1】:

您打开 ServiceHost 并立即将其关闭。 serviceHost.Open() 方法不会阻塞。所以你的端点不存在,因为你连接时主机已经关闭了

【讨论】:

  • 我也忘记在客户端设置绑定安全模式。应该是:NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
猜你喜欢
  • 2011-02-24
  • 2013-10-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多