C#学习教程:添加https绑定时Microsoft.Web.Administration中出现NullReferenceExceptionMicrosoft.Web.Administrationdll中的引用异常。最初我想分配证书和绑定。我可以用这个查询我想要的证书:varstore=newX509Store(StoreName.Root,StoreLocation.LocalMachine);store.Open(OpenFlags.OpenExistingOnly|OpenFlags.ReadWrite);varcertificate=store.Certificates.Find(X509FindType.FindByIssuerName,"TEST_SELF_SIGNED",true).OfType().FirstOrDefault();这正确地为我提供了我想要的证书,该证书是非空的并且具有我期望的信息。站点site=GetSite("默认网站");varbinding=site.Bindings.Add("*:443",certificate.GetCertHash(),"https");鉴于我的变量或示例代码中的任何其他项目None为null(包括返回20字节数组的GetCertHash),我很困惑为什么我在这里得到一个null。我什至尝试了以下重载:site.Bindings.Add("*:443","https");我仍然得到相同的空引用堆栈:System.NullReferenceException未处理Message=Objectreferencenotsettoaninstanceofanobject。源=Microsoft.Web.Administration堆栈跟踪:在Microsoft.Web.Administration.Configuration.SetDirty()在Microsoft.Web.Administration.ConfigurationElement.SetDirty()在Microsoft.Web.Administration.ConfigurationElement.SetAttributeValue(StringattributeName,Objectvalue))在Microsoft.Web.Administration.Binding.SetBindingProperty(StringattributeName,Stringvalue)C:\ProjectsCubetrunksrcAutoUpdateTestAppProgram.cs:System.AppDomain._nExecuteAssembly(RuntimeAssemblyassembly,String[]args)inSystem.AppDomain.ExecuteAssembly(StringassemblyFile,EvidenceassemblySecurity,String[]args)在微软的第33行.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)在System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallback回调,对象状态,布尔值ignoreSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallback回调,对象状态):这是一个完整的测试应用程序,它演示了这个问题,以及我用来生成示例证书的selfssl命令行参数:selfssl.exe/T/N:CN=TEST_SELF_SIGNED/K:512/V:9999/Q类程序{staticvoidMain(string[]args){using(ServerManagermanager=newServerManager()){varstore=newX509Store(StoreName.Root,StoreLocation.LocalMachine);store.Open(OpenFlags.OpenExistingOnly|OpenFlags.ReadWrite);varcertificate=store.Certificates.Find(X509FindType.FindByIssuerName,"TEST_SELF_SIGNED",true).OfType().FirstOrDefault();站点site=GetSite("默认网站");site.Bindings.Add("*:443",certificate.GetCertHash(),store.Name);商店。关闭();经理.CommitChanges();}}publicstaticSiteGetSite(字符串站点名称){使用(varserverManager=newServerManager()){返回serverManager.Sites.Where(p=>p.Name.ToLower()==siteName.ToLower()).FirstOrDefault();}}}只是为了覆盖我的基础,安装了Iis并且手动分配证书工作正常所以我通过反编译Microsoft.Web.Administrationdll并在堆栈中查找发现了。事实证明,如果您获得一个带有辅助函数的站点,它不会在该站点上设置内部ServerManager属性。导致问题的DLL函数在Microsoft.Web.Administration::ConfigurationinternalvoidSetDirty(){if(this._hasBeenCommitted||this._configurationManager.Owner.ReadOnly)thrownewInvalidOperationException(Resources.ObjectHasBeenCommited);这。_isDirty=真;此处唯一可以为null的是_configurationManager或_configurationManager.Owner。我检查了所有者是什么,它是一个ServerManager,它让我知道我应该从服务器管理器的using块中查询站点。一旦我这样做了,空引用就消失了,一切正常。不幸的是,他们不检查null,但可能假设没有服务器管理器上下文,没有人会对站点对象进行操作。不管怎样,这是更新后的代码:varwebsiteName="默认网站";varsite=serverManager.Sites.Where(p=>p.Name.ToLower()==websiteName.ToLower()).FirstOrDefault();varstore=newX509Store(StoreName.Root,StoreLocation.LocalMachine);store.Open(OpenFlags.OpenExistingOnly|OpenFlags.ReadWrite);varcertificate=store.Certificates.Find(X509FindType.FindByIssuerName,selfSignedCnName,true).OfType().FirstOrDefault();site.Bindings.Add("*:443:",certificate.GetCertHash(),store.Name);商店。关闭();serverManager.CommitChanges();从我最初的帖子中可以清楚地看出,将整个代码块包装在服务器管理器中并不意味着什么,它们没有级联。你必须从它来自的服务器管理器来做这个网站。以上就是C#学习教程:添加https绑定时,Microsoft.Web.Administration中NullReferenceException分享的所有内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注——本文来自网络合集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
