NullReferenceException w Microsoft.Web.Administration podczas dodawania powiązania https
Usiłuję programowo dodać powiązanie do mojej domyślnej witryny internetowej, jednak konsekwentnie otrzymuję wyjątek odniesienia null w bibliotece DLL Microsoft.Web.Administration. Pierwotnie chciałem przypisać certyfikat wraz z oprawą. Udało mi się zapytać o certyfikat, który chciałem:
<code>var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite); var certificate = store.Certificates.Find(X509FindType.FindByIssuerName, "TEST_SELF_SIGNED", true) .OfType<X509Certificate>().FirstOrDefault(); </code>
To właściwie dało mi certyfikat, który chciałem, był nieważny i miał informacje, których oczekiwałem.
<code>Site site = GetSite("Default Web Site"); var binding = site.Bindings.Add("*:443", certificate.GetCertHash(), "https"); </code>
Biorąc pod uwagę, że żadna z moich zmiennych ani żadnych innych elementów w przykładowym kodzie nie jest null (w tym GetCertHash, który zwraca tablicę 20-bajtową), jestem zdezorientowany, dlaczego otrzymuję tutaj wartość null. Próbowałem nawet następującego przeciążenia:
<code>site.Bindings.Add("*:443", "https"); </code>
Nadal otrzymuję ten sam stos zerowy:
System.NullReferenceException was unhandled Message=Object reference not set to an instance of an object. Source=Microsoft.Web.Administration StackTrace: at Microsoft.Web.Administration.Configuration.SetDirty() at Microsoft.Web.Administration.ConfigurationElement.SetDirty() at Microsoft.Web.Administration.ConfigurationElement.SetAttributeValue(String attributeName, Object value) at Microsoft.Web.Administration.Binding.SetBindingProperty(String attributeName, String value) at Microsoft.Web.Administration.BindingCollection.Add(String bindingInformation, Byte[] certificateHash, String certificateStoreName) at TestApp.Program.Main(String[] args) in C:\Projects\Cube\trunk\src\AutoUpdate\TestApp\Program.cs:line 33 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:
Oto pełna aplikacja testowa, która demonstruje ten problem, wraz z argumentami wiersza poleceń selfssl, których użyłem do wygenerowania przykładowego certyfikatu:
selfssl.exe / T / N: CN = TEST_SELF_SIGNED / K: 512 / V: 9999 / Q
<code>class Program { static void Main(string[] args) { using (ServerManager manager = new ServerManager()) { var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite); var certificate = store.Certificates.Find(X509FindType.FindByIssuerName, "TEST_SELF_SIGNED", true).OfType<X509Certificate>().FirstOrDefault(); Site site = GetSite("Default Web Site"); site.Bindings.Add("*:443", certificate.GetCertHash(), store.Name); store.Close(); manager.CommitChanges(); } } public static Site GetSite(string siteName) { using (var serverManager = new ServerManager()) { return serverManager.Sites.Where(p => p.Name.ToLower() == siteName.ToLower()).FirstOrDefault(); } } } </code>
Aby pokryć moje bazy, Iis jest zainstalowany i ręczne przypisanie certyfikatu działa dobrze.