2013-08-05 6 views
7

Dobrze, więc obsługuję usługę WCF w aplikacji konsolowej.Samohostowana usługa WCF działa z protokołem HTTP nie z HTTPS

wszystkie wiązania są tworzone programowo, więc nie ma ustawień konfiguracyjnych.

Mam usługi pracy tak długo, jak używać HttpTransportBindingElement jednak tak szybko, jak używam HttpsTransportBindingElement wtedy nic nie działa, usługa nie wyświetla się w przeglądarce i aplikacji klient zwraca 405 (Method Not Allowed) CommunicationException

Próbowałem ustawienie SecurityBindingElement do mojego CustomBinding, ale nie jestem pewien, której opcji powinienem użyć.

SecurityBindingElement.CreateCertificateOverTransportBindingElement()

SecurityBindingElement.CreateAnonymousForCertificateBindingElement()

itp

Kod do tworzenia przyjmującego jest poniżej

baseAddress = new Uri(string.Format("{0}://{1}", strConnectionType, ConfigurationManager.AppSettings["baseAddress"])); 

      ServiceHost host = new ServiceHost(typeof(IMyService), baseAddress); 

      host.AddServiceEndpoint(typeof(MyService), binding, String.Empty); 

      ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
      smb.HttpsGetEnabled = certificate != null; 
      smb.HttpGetEnabled = certificate == null; 

      host.Description.Behaviors.Add(smb); 

      ServiceDebugBehavior sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>(); 

      if (sdb == null) 
      { 
       host.Description.Behaviors.Add(new ServiceDebugBehavior() { IncludeExceptionDetailInFaults = true }); 
      } 
      else 
      { 
       if (!sdb.IncludeExceptionDetailInFaults) 
       { 
        sdb.IncludeExceptionDetailInFaults = true; 
       } 
      } 


      if (certificate != null) 
      { 
       host.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, certificate.Thumbprint); 
      } 
+1

Co to jest "wiążące"? Również programowa konfiguracja usług WCF jest cholernie trudna, dlaczego nie skorzystać z pliku konfiguracyjnego? –

+0

@ ta.speot.jestbyś w stanie rozwinąć więcej na swoje pytanie? –

+1

@ shankar-damodaran dzięki za edycję :) –

Odpowiedz

6

Śledziłem ten blog http://blogs.msdn.com/b/james_osbornes_blog/archive/2010/12/10/selfhosting-a-wcf-service-over-https.aspx którym podkreślono, że aby HTTPS pracować, musisz związać port z certyfikatem, którego używasz.

Process bindPortToCertificate = new Process(); bindPortToCertificate.StartInfo.FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), "netsh.exe");

bindPortToCertificate.StartInfo.Arguments = string.Format("http add sslcert ipport=0.0.0.0:{0} certhash={1} appid={{{2}}}", port, certificate.Thumbprint, Guid.NewGuid());

bindPortToCertificate.Start();

bindPortToCertificate.WaitForExit();

raz stało się to wszystko działało.

skontaktuj się ze mną, jeśli jest to wymagane, mój przykładowy kod konfiguracji i konfigurowania samodzielnie hostowanego serwera WCF z programowo ustawionymi powiązaniami. :)