无法在Startup.cs中保存ConfigurationSection - Web API

时间:2015-01-16 20:20:34

标签: c# asp.net-web-api configurationsection

我无法在启动时将自定义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方法......

如何解决这个问题?

0 个答案:

没有答案