我有一个使用System.ServiceModel.dll的c#app。我可以在本地运行应用程序,但是当我尝试使用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();
}
}
}
我可以在localhost运行它并且它可以工作。但是如果我从另一台主机运行以下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();
如果我必须使用电源shell远程运行应用程序,我该如何解决这个问题?
非常感谢!
答案 0 :(得分:-1)
如果我没记错的话,命名管道是单台计算机本地的。据我所知,您不能使用命名管道“远程”连接。
在这种情况下,我建议使用其他绑定(协议)。例如,您可以使用http / https,nettcp或WSHttp。