4

我有使用 System.ServiceModel.dll 的 ac# 应用程序。我可以在本地运行该应用程序,但是当我尝试使用 Power Shell 远程运行它时,它会挂起:

这是重新创建问题的简单代码:

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Discovery;

    namespace PowerShellSecurity
    {
        class Program
        {
            static void Main(string[] args)
            {
                var serviceUri = "net.pipe://localhost/Foo/Bar";
                var discoveryUri = new Uri("soap.udp://239.255.255.250:3702/");

                var service = new MyService();

                var serviceHost = new ServiceHost(service, new Uri(serviceUri));
                serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
                serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint(discoveryUri));
                serviceHost.AddServiceEndpoint(typeof(IMyService), new NetNamedPipeBinding(), serviceUri);

                serviceHost.Open();

                Console.WriteLine("It worked!");
            }
        }

        [ServiceContract]
        public interface IMyService
        {
            [OperationContract]
            void DoStuff();
        }

        [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
        public class MyService : IMyService
        {
            public void DoStuff()
            {
                throw new NotImplementedException();
            }
        }
    }

我可以在本地主机上运行它并且它可以工作。但是,如果我从另一台主机运行以下 powershell 命令:

icm -ComputerName myHost -ScriptBlock {iex "& 'c:\Users\me\Documents\Visual Studio 2013\Projects\PowerShellSecurity\PowerShellSecurity\bin\Debug\PowerShellSecurity.exe'"}

我可以使用 procexp 看到挂在 myHost 上的进程。

然后我用Visual Studio附加到这个进程,我可以看到它卡在: serviceHost.Open();

如果我必须使用 power shell 远程运行应用程序,我该如何解决这个问题?

非常感谢!

4

1 回答 1

-1

如果我没记错的话,命名管道是单台计算机本地的。据我所知,您不能使用命名管道“远程”连接。

在这种情况下,我建议使用不同的绑定(协议)。例如,您可以使用 http/https、nettcp 或 WSHttp。

于 2018-08-22T04:39:23.907 回答