Я пытаюсь разместить службу, которая обслуживает основной веб-контент (HTML, javascript, json), используя WebHttpBinding с минимальным участием администратора.
Пока я добился успеха, единственные необходимые привилегии администратора - во время установки (зарегистрируйте резервирование http для учетной записи службы и для создания самой службы). Однако сейчас у меня проблемы с SSL. В идеале я хотел бы поддержать сертификат за пределами хранилища сертификатов Windows. Я нашел эту статью - http://www.codeproject.com/KB/WCF/wcfcertificates.aspx - которая, кажется, указывает, что вы можете указать сертификат на хосте службы, однако во время выполнения при переходе браузера к https://localhost/Dev/MyService получается 404.
[ServiceContract]
public interface IWhoAmIService
{
[OperationContract]
[WebInvoke(
Method = "GET",
UriTemplate = "/")]
Stream WhoAmI();
}
public class WhoAmIService : IWhoAmIService
{
public Stream WhoAmI()
{
string html = "<html><head><title>Hello, world!</title></head><body><p>Hello from {0}</p></body></html>";
html = string.Format(html, WindowsIdentity.GetCurrent().Name);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
return new MemoryStream(Encoding.UTF8.GetBytes(html));
}
}
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(WhoAmIService), new Uri("https://localhost:443/Dev/WhoAmI"));
host.Credentials.ServiceCertificate.Certificate = new X509Certificate2(@"D:\dev\Server.pfx", "private");
WebHttpBehavior behvior = new WebHttpBehavior();
behvior.DefaultBodyStyle = WebMessageBodyStyle.Bare;
behvior.DefaultOutgoingResponseFormat = WebMessageFormat.Json;
behvior.AutomaticFormatSelectionEnabled = false;
WebHttpBinding secureBinding = new WebHttpBinding();
secureBinding.Security.Mode = WebHttpSecurityMode.Transport;
secureBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
ServiceEndpoint secureEndpoint = host.AddServiceEndpoint(typeof(IWhoAmIService), secureBinding, "");
secureEndpoint.Behaviors.Add(behvior);
host.Open();
Console.WriteLine("Press enter to exit...");
Console.ReadLine();
host.Close();
}
Если я поменяю безопасность привязки на none и базовый URI, чтобы начать с http, все будет хорошо. Похоже, в этом посте указывается, что для регистрации сертификата с портом с помощью netsh необходимо выполнить дополнительную команду (http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6907d765-7d4c-48e8-9e29-3ac5b4b9c405/).. Когда я пытаюсь это сделать, происходит сбой с некоторой непонятной ошибкой (1312).
C:\Windows\system32>netsh http add sslcert ipport=0.0.0.0:443 certhash=0b740a29f
29f2cc795bf4f8730b83f303f26a6d5 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
SSL Certificate add failed, Error: 1312
A specified logon session does not exist. It may already have been terminated.
Как разместить эту службу с использованием HTTPS без хранилища сертификатов Windows?