我无法在启动时将自定义ConfigurationSection
保存在我的web.config
文件中。
我已遵循此tutorial进行通用实施。我的单元测试通过了,我能够在单元测试中保存de ConfigurationSection
!
在应用程序启动时,我想基于控制器类名和所属方法名来构建ClaimCollection
:
Startup.cs
public void Configuration(IAppBuilder app)
{
Config = new HttpConfiguration();
BuildUnityContainer();
BuildClaimCollection(); <----------------
ConfigureOAuth(app);
WebApiConfig.Register(Config);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(Config);
}
public void BuildClaimCollection()
{
//config section
MethodClaimSection methodClaimSection = BaseConfigurationSection<MethodClaimSection>.Open();
var methods = GetClaimAuthorizedMethods();
foreach (var method in methods)
{
var claimValue = GetClaimValueFromMethodName(method);
var claim = new MethodClaimElement()
{
Type = "Method",
Value = claimValue
};
methodClaimSection.MethodClaims.Add(claim);
}
methodClaimSection.Save();
}
BaseConfigurationSection.cs
public abstract class BaseConfigurationSection<T> : ConfigurationSection
where T : ConfigurationSection, new()
{
public void Save()
{
System.Configuration.Configuration config = BaseConfigurationSection<T>.GetConfiguration();
T section = (T)config.Sections[typeof(T).Name];
foreach (var property in this.GetType().GetProperties())
{
if (property.IsDefined(typeof(ConfigurationPropertyAttribute), false))
{
section.GetType().InvokeMember(property.Name, BindingFlags.SetProperty, null, section,
new object[] {
.GetType().InvokeMember(property.Name, BindingFlags.GetProperty, null, this, null)
});
}
}
config.Save(ConfigurationSaveMode.Full);
}
}
当我运行WebApi应用程序时,我收到此错误:
无法访问已处置的对象。 对象名:'System.Web.Http.HttpServer'。
堆栈跟踪:
[ObjectDisposedException:无法访问已处置的对象。 对象名:'System.Web.Http.HttpServer'。] System.Net.Http.DelegatingHandler.CheckDisposed()+332772 System.Net.Http.DelegatingHandler.CheckDisposedOrStarted()+13 System.Net.Http.DelegatingHandler.set_InnerHandler(HttpMessageHandler value)+23 System.Web.Http.HttpServer.Initialize()+108 System.Web.Http.HttpServer.b__b()+31 System.Threading.LazyInitializer.EnsureInitializedCore(T&amp; target,Boolean&amp; initialized,Object&amp; syncLock,Func`1 valueFactory)+115 System.Threading.LazyInitializer.EnsureInitialized(T&amp; target,Boolean&amp; initialized,Object&amp; syncLock,Func`1 valueFactory)+72 System.Web.Http.HttpServer.EnsureInitialized()+ 119 System.Web.Http.d__0.MoveNext()+ 276 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+3897072 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()+28 System.Web.Http.Owin.d__0.MoveNext()+1139 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+3897072 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()+26 Microsoft.Owin.Cors.d__0.MoveNext()+1204 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+3897072 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()+26 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__5.MoveNext()+287 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+3897072 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()+26 Microsoft.Owin.Security.Infrastructure.d__0.MoveNext()+937 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+3897072 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()+26 Microsoft.Owin.Security.Infrastructure.d__0.MoveNext()+937 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+3897072 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()+26 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__5.MoveNext()+287 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+3897072 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()+26 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__2.MoveNext()+272 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()+26 Microsoft.Owin.Host.SystemWeb.Infrastructure.ErrorState.Rethrow()+ 33 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar)+150 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar)+42 System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+415 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+155
Configuration类没有Dispose方法......
如何解决这个问题?