NullReferenceException no Microsoft.Web.Administration ao adicionar a ligação de https
Eu estou tentando programaticamente adicionar uma ligação para o meu site padrão no entanto estou consistentemente recebendo uma exceção de referência nula dentro da dll Microsoft.Web.Administration. Originalmente, queria atribuir um certificado junto com a ligação. Consegui consultar o certificado que queria com isso:
<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>
Isso me deu o certificado que eu queria, não era nulo e tinha a informação que eu esperava.
<code>Site site = GetSite("Default Web Site"); var binding = site.Bindings.Add("*:443", certificate.GetCertHash(), "https"); </code>
Dado que nenhuma das minhas variáveis ou quaisquer outros itens no código de amostra são nulos (incluindo GetCertHash que retorna uma matriz de 20 bytes) eu estou confuso quanto ao motivo de eu estar recebendo um nulo aqui. Eu até tentei a seguinte sobrecarga:
<code>site.Bindings.Add("*:443", "https"); </code>
E ainda recebo a mesma pilha de refas nulas:
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:
Aqui está um aplicativo de teste completo que demonstartes o problema, juntamente com os argumentos de linha de comando selfssl que usei para gerar o certificado de amostra:
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>
Apenas para cobrir minhas bases, o Iis está instalado e a atribuição manual do certificado funciona bem.