WCF EndpointNotFoundException при работе в качестве NetworkService
У меня есть служба net.Pipe WCF, которая размещается в IIS (прямо сейчас, в моем VS2010): (Global.asax):
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
ServiceHost svcHost = new ServiceHost(typeof(DoSomethingService), new Uri("net.pipe://localhost/helloworld"));
var serviceBinding = new NetNamedPipeBinding { MaxReceivedMessageSize = int.MaxValue, MaxConnections = 2048 };
var sect = new NamedPipeTransportSecurity { ProtectionLevel = ProtectionLevel.EncryptAndSign };
var sec = new NetNamedPipeSecurity { Mode = NetNamedPipeSecurityMode.Transport, Transport = sect };
serviceBinding.Security = sec;
svcHost.AddServiceEndpoint(typeof(IDoSomethingContract), serviceBinding, "");
svcHost.Open();
}
У меня есть клиент консольного приложения:
static void Main(string[] args)
{
var factory = new ChannelFactory<IDoSomethingContract>();
var defaultCredentials = factory.Endpoint.Behaviors.Find<ClientCredentials>();
factory.Endpoint.Behaviors.Remove(defaultCredentials);
factory.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
var serviceBinding = new NetNamedPipeBinding { MaxReceivedMessageSize = int.MaxValue, MaxConnections = 2048 };
var sect = new NamedPipeTransportSecurity { ProtectionLevel = ProtectionLevel.EncryptAndSign };
var sec = new NetNamedPipeSecurity { Mode = NetNamedPipeSecurityMode.Transport, Transport = sect };
serviceBinding.Security = sec;
var ep = new EndpointAddress("net.pipe://localhost/helloworld");
factory.Endpoint.Binding = serviceBinding;
var love = factory.CreateChannel(ep);
Console.WriteLine(love.Do());
Console.ReadKey();
}
Теперь все работает отлично, когда я запускаю это как пользовательский принципал (и поэтому я могу использовать PrincipalPermission внутри моей работы).
Однако, если я создаю себе приглашение командной строки "Сетевой сервис" (используя psexec) и пытаюсь запустить клиент (с работающей службой, очевидно), я получаю исключение EndpointNotFoundException.
Что мне нужно сделать, чтобы Network Service увидел мой именованный канал?
2 ответа
Я думал об удалении этого, но так как кто-то на самом деле прокомментировал - я нашел ответ здесь: http://social.msdn.microsoft.com/Forums/vstudio/en-US/fcb7254a-15b5-4be4-bf67-34d500bdce2d/wcf-netpipe-endpoint-not-found-exception-whitout-elevated-user-rights-uac-enabled?forum=wcf с правами UAC поддержки? форум = ФОС
По сути, так как я использовал свой dev-сервер в качестве своей собственной учетной записи, сервис был опубликован в пространстве имен Session. После того, как я опубликовал это на реальном IIS в качестве сетевой службы, он был виден в глобальном пространстве имен, поэтому я мог его видеть.
Может быть, следующие статьи полезны для вас
http://msdn.microsoft.com/en-us/library/dd728288%28v=vs.110%29.aspx