Невозможно использовать powershell для удаленного запуска приложения WCF (System.ServiceModel).
У меня есть приложение aC#, использующее System.ServiceModel.dll. Я могу запустить приложение локально, но когда я пытаюсь использовать 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'"}
Я вижу, как процесс висит на myHost с использованием procxp.
Затем я использовал Visual Studio для подключения к этому процессу, я вижу, что он застрял в: serviceHost.Open();
Как я могу решить эту проблему, если мне нужно использовать Power Shell для удаленного запуска приложения?
Большое спасибо!
1 ответ
Если я не ошибаюсь, именованные каналы являются локальными для одного компьютера. Насколько я знаю, вы не можете подключиться "удаленно", используя именованные каналы.
В этом случае я бы рекомендовал использовать другую привязку (протокол). Например, вы можете использовать http/https, nettcp или WSHttp.