简体   繁体   English

C#WCF System.Configuration.ConfigurationErrorsException:无法识别的元素'ManagedService'

[英]C# WCF System.Configuration.ConfigurationErrorsException: Unrecognized element 'ManagedService'

In a WCF application I have some custom configuration classes for use in app.config . 在WCF应用程序中,我有一些自定义配置类可供app.config使用。 However, I'm getting the following Stack Trace from the WCF Service Host (It attempts to retrieve the custom configuration in the constructor of the WCF service): 但是,我从WCF服务主机获取以下堆栈跟踪(它尝试在WCF服务的构造函数中检索自定义配置):

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---> System.Configuration.ConfigurationErrorsException: Unrecognized element 'ManagedService'. ---> System.Configuration.ConfigurationErrorsException:无法识别的元素'ManagedService'。 (Service.dll.config line 8) at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult) at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean chec (Service.dll.config第8行)在System.Configuration.BaseConfigurationRecord.EvaluateOne(String []键,SectionInput输入,Boolean isTrusted,FactoryRecord factoryRecord,SectionRecord sectionRecord,Object parentResult)处于System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord,Object parentResult,Boolean getLkg,Boolean getRuntimeObject,Object&result,Object&resultRuntimeObject)at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&result,Object&resultRuntimeObject)at System System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean chec).Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&result,Object&resultRuntimeObject) kPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSection(String configKey) at System.Configuration.ConfigurationManager.GetSection(String sectionName) at ManagementService..ctor() in ManagementService.cs:line 42 --- End of inner exception stack trace --- at System.RuntimeMethodHandle._InvokeConstructor(IRuntimeMethodInfo method, Object[] args, SignatureStruct& signature, RuntimeType declaringType) at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 位于ManagementService.cs中ManagementService..ctor()的System.Configuration.ConfigurationManager.GetSection(String sectionName)的System.Configuration.BaseConfigurationRecord.GetSection(String configKey)中的kPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&result,Object&resultRuntimeObject):第42行---内部异常堆栈跟踪的结束---在System.ReflectionMethodHandle._InvokeConstructor(IRuntimeMethodInfo方法,Object [] args,SignatureStruct&signature,RuntimeType declaringType)处于System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr,Binder binder, Object []参数,CultureInfo文化)
at System.ServiceModel.Description.ServiceDescription.CreateImplementation(Type serviceType) at System.ServiceModel.Description.ServiceDescription.GetService(Type serviceType) at System.ServiceModel.ServiceHost.CreateDescription(IDictionary`2& implementedContracts) at System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses) at System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses) at Microsoft.Tools.SvcHost.ServiceHostHelper.CreateServiceHost(Type type, ServiceKind kind) at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info) System.Configuration.ConfigurationErrorsException: Unrecognized element 'ManagedService'. System.ServiceModel.ServiceHostBase.InitializeDescription上System.ServiceModel.ServiceHost.CreateDescription(IDictionary`2&implementedContracts)的System.ServiceModel.Description.ServiceDescription.GetService(Type serviceType)上的System.ServiceModel.Description.ServiceDescription.CreateImplementation(Type serviceType) (UriSchemeKeylection baseAddresses)位于Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService的Microsoft.Tools.SvcHost.ServiceHostHelper.CreateServiceHost(Type type,ServiceKind kind)的System.ServiceModel.ServiceHost..ctor(类型serviceType,Uri [] baseAddresses) ServiceInfo info)System.Configuration.ConfigurationErrorsException:无法识别的元素'ManagedService'。 (Service.dll.config line 8) at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult) at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean chec (Service.dll.config第8行)在System.Configuration.BaseConfigurationRecord.EvaluateOne(String []键,SectionInput输入,Boolean isTrusted,FactoryRecord factoryRecord,SectionRecord sectionRecord,Object parentResult)处于System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord,Object parentResult,Boolean getLkg,Boolean getRuntimeObject,Object&result,Object&resultRuntimeObject)at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&result,Object&resultRuntimeObject)at System System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean chec).Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&result,Object&resultRuntimeObject) kPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSection(String configKey) at System.Configuration.ConfigurationManager.GetSection(String sectionName) at ManagementService..ctor() in ManagementService.cs:line 42 位于ManagementService.cs中ManagementService..ctor()的System.Configuration.ConfigurationManager.GetSection(String sectionName)的System.Configuration.BaseConfigurationRecord.GetSection(String configKey)中的kPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&result,Object&resultRuntimeObject):第42行

(Sorry for the nasty stack trace). (抱歉讨厌的堆栈跟踪)。

I've looked at tons of tutorials and other questions here about this error and none of the suggestions or solutions have gone anywhere. 我在这里看了很多关于这个错误的教程和其他问题,并没有任何建议或解决方案在任何地方。

Here's the relevant portion of the app.config 这是app.config的相关部分

<configSections>
     <section name="ManagedServices" type="Service.Configuration.ManagedServicesSection, Service, Version=1.0.0.0, Culture=neutral " allowLocation="true" allowDefinition="Everywhere" restartOnExternalChanges="false" />
</configSections>
  <ManagedServices>
     <services>
        <ManagedService serviceAssembly="Service" serviceType="Service.Runnables.HostManagerRunner" identifier="HostManager" priority="0">
           <clear />
        </ManagedService>
        <ManagedService serviceAssembly="Service" serviceType="Service.Runnables.TimeoutMonitor" identifier="TimeoutMonitor" priority="0">
           <add key="timeoutLength" value="30" />
           <add key="runInterval" value="30" />
        </ManagedService>
     </services>
  </ManagedServices>

Basically, this WCF service is used to manage other services which are loaded and started dynamically (informed via this configuration) on start up. 基本上,此WCF服务用于管理在启动时动态加载和启动的其他服务(通过此配置通知)。

<ManagedServices> is from the ManagedServicesSection which inherits from ConfigurationSection <ManagedServices>来自ManagedServicesSection ,它继承自ConfigurationSection

public class ManagedServicesSection : ConfigurationSection
{

  [ConfigurationProperty("services", IsDefaultCollection = true)]
  public ManagedServiceCollection ServiceCollection
  {
     get { return (ManagedServiceCollection) base["services"]; }
  }

}

As you can see from this, <services> is a MangedServiceCollection which inherits from ConfigurationElementCollection 从中可以看出, <services>是一个MangedServiceCollection ,它继承自ConfigurationElementCollection

public class ManagedServiceCollection : ConfigurationElementCollection
{

  public ManagedServiceCollection()
  {
  }

  public override ConfigurationElementCollectionType CollectionType
  {
     get
     {
        return ConfigurationElementCollectionType.BasicMap;
     }
  }

  public ManagedService this[int index]
  {
     get { return BaseGet(index) as ManagedService; }
     set
     {
        if (BaseGet(index) != null)
           BaseRemoveAt(index);

        BaseAdd(index, value);
     }
  }

  public ManagedService this[string name]
  {
     get { return BaseGet(name) as ManagedService; }
     set 
     { 
        if (BaseGet(name) != null)
           BaseRemove(name);

        BaseAdd(value);
     }
  }

  protected override ConfigurationElement CreateNewElement()
  {
     return new ManagedService();
  }

  protected override object GetElementKey(ConfigurationElement element)
  {
     return ((ManagedService)element).Identifier;
  }
}

This collection holds ManagedService s which inherit from ConfigurationElement : 此集合包含从ConfigurationElement继承的ManagedService

public class ManagedService : ConfigurationElement
{
  [ConfigurationProperty("serviceAssembly", IsRequired = true)]
  public string ServiceAssembly
  {
     get { return (string) this["serviceAssembly"]; }
     set { this["serviceAssembly"] = value; }
  }

  [ConfigurationProperty("serviceType", DefaultValue = "IRunnable", IsRequired = true)]
  public string ServiceType 
  { 
     get { return (string) this["serviceType"]; }
     set { this["serviceType"] = value; }
  }

  [ConfigurationProperty("identifier", IsRequired = true, IsKey = true)]
  public string Identifier
  {
     get { return (string) this["identifier"]; }
     set { this["identifier"] = value; }
  }


  [ConfigurationProperty("priority", DefaultValue = 0, IsRequired = false)]
  public int Priority
  {
     get { return (int) this["priority"]; }
     set { this["priority"] = value; }
  }

  [ConfigurationProperty("serviceParameters", IsDefaultCollection = true)]
  public ServiceParameterCollection ServiceParameters
  {
     get { return (ServiceParameterCollection)base["serviceParamters"]; }
  }
}

The code may be easier to look at in this pastie pastie.org/private/jkiylqsrklpcdbtfdrajq 代码可能更容易在这个贴图中看到pastie.org/private/jkiylqsrklpcdbtfdrajq

I could not complied your sample, ServiceParameterCollection was missing... so I have prepared you my working samle. 我无法编写你的样本,ServiceParameterCollection丢失了...所以我已经准备好了你的工作样本。 Here we go... 开始了...

First lets create config classes, take notice on AddItemName ConfigurationCollection parameter (I think this is what you are missing in your code): 首先让我们创建配置类,注意AddItemName ConfigurationCollection参数(我认为这是你在代码中缺少的):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace GP.Solutions.WF.DocumentProvider.Entities.SharePoint
{
    /// <summary>
    /// Base SharePoint 2010 provider contiguration
    /// </summary>
    [Serializable]
    public class SharePoint2010Settings : ConfigurationSection
    {
        /// <summary>
        /// DocumentStorageRoot
        /// </summary>
        [ConfigurationProperty("SiteUrl", IsRequired = true, DefaultValue = "")]
        public string SiteUrl
        {
            get { return (string)base["SiteUrl"]; }
            set { base["SiteUrl"] = value; }
        }

        /// <summary>
        /// TitleProperty
        /// </summary>
        [ConfigurationProperty("TitleProperty", IsRequired = true, DefaultValue = "Title")]
        public string TitleProperty
        {
            get { return (string)base["TitleProperty"]; }
            set { base["TitleProperty"] = value; }
        }

        /// <summary>
        /// ProvideFileAsLink
        /// </summary>
        [ConfigurationProperty("ProvideFileAsLink", IsRequired = true, DefaultValue = true)]
        public bool ProvideFileAsLink
        {
            get { return (bool)base["ProvideFileAsLink"]; }
            set { base["ProvideFileAsLink"] = value; }
        }

        /// <summary>
        /// DocumentCategories
        /// </summary>
        [ConfigurationProperty("DocumentCategories")]
        public SharePointDocumentCategoryCollection DocumentCategories
        {
            get { return (SharePointDocumentCategoryCollection)base["DocumentCategories"]; }
            set { base["DocumentCategories"] = value; }
        }

    }

    /// <summary>
    /// Configuration element that holds SharePointDocumentCategory collection
    /// </summary>
    [ConfigurationCollection(typeof(SharePointDocumentCategory), AddItemName = "DocumentCategory", CollectionType = ConfigurationElementCollectionType.BasicMap)]
    public class SharePointDocumentCategoryCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new SharePointDocumentCategory();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((SharePointDocumentCategory)element).CategoryName;
        }
    }

    /// <summary>
    /// Configuration element that holds information for specific document category
    /// </summary>
    [Serializable]
    public class SharePointDocumentCategory: ConfigurationElement
    {
        /// <summary>
        /// CategoryName
        /// </summary>
        [ConfigurationProperty("CategoryName", IsRequired = true, DefaultValue = "")]
        public string CategoryName
        {
            get { return (string)base["CategoryName"]; }
            set { base["CategoryName"] = value; }
        }

        /// <summary>
        /// FolderName
        /// </summary>
        [ConfigurationProperty("FolderName", IsRequired = true, DefaultValue = "")]
        public string FolderName
        {
            get { return (string)base["FolderName"]; }
            set { base["FolderName"] = value; }
        }


        /// <summary>
        /// TitleProperty
        /// </summary>
        [ConfigurationProperty("OverwriteFiles", IsRequired = true, DefaultValue = true)]
        public bool OverwriteFiles
        {
            get { return (bool)base["OverwriteFiles"]; }
            set { base["OverwriteFiles"] = value; }
        }

        /// <summary>
        /// DocumentCategories
        /// </summary>
        [ConfigurationProperty("CategoryFields")]
        public SharePointCategoryFieldsCollection CategoryFields
        {
            get { return (SharePointCategoryFieldsCollection)base["CategoryFields"]; }
            set { base["CategoryFields"] = value; }
        }

    }

    /// <summary>
    /// Configuration element that holds SharePointDocumentCategory collection
    /// </summary>
    [ConfigurationCollection(typeof(SharePointDocumentCategory), AddItemName = "CategoryField", CollectionType = ConfigurationElementCollectionType.BasicMap)]
    public class SharePointCategoryFieldsCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new SharePointCategoryField();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((SharePointCategoryField)element).FieldName;
        }
    }

    /// <summary>
    /// Class that determines specific field
    /// </summary>
    [Serializable]
    public class SharePointCategoryField : ConfigurationElement
    {
        /// <summary>
        /// FolderName
        /// </summary>
        [ConfigurationProperty("FieldName", IsRequired = true, DefaultValue = "")]
        public string FieldName
        {
            get { return (string)base["FieldName"]; }
            set { base["FieldName"] = value; }
        }
    }

}

And here is web.config part: 这是web.config部分:

  <configSections>
    <sectionGroup name="CustomConfiguration">
      <section name="SharePoint2010Section" type="GP.Solutions.WF.DocumentProvider.Entities.SharePoint.SharePoint2010Settings,CustomConfiguration" allowDefinition="Everywhere" allowLocation="true"/>
    </sectionGroup>

  </configSections>

  <CustomConfiguration>

    <SharePoint2010Section SiteUrl="http://server" TitleProperty="Title" ProvideFileAsLink="false">
        <DocumentCategories>

          <DocumentCategory CategoryName="Vhodni računi" FolderName="" OverwriteFiles="true">
            <CategoryFields>
              <CategoryField FieldName="Datum" />
              <CategoryField FieldName="Vrednost" />
            </CategoryFields>
          </DocumentCategory>

          <DocumentCategory CategoryName="Zahtevek za dopust" FolderName="" OverwriteFiles="true">
            <CategoryFields>
              <CategoryField FieldName="Datum od" />
              <CategoryField FieldName="Datum do" />
            </CategoryFields>
          </DocumentCategory>

        </DocumentCategories>
    </SharePoint2010Section>
  </CustomConfiguration>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 System.Configuration.ConfigurationErrorsException-无法识别的元素“设置” - System.Configuration.ConfigurationErrorsException - Unrecognized element 'setting' WCF:System.Configuration.ConfigurationErrorsException - WCF: System.Configuration.ConfigurationErrorsException C#-编译器错误:未处理System.Configuration.ConfigurationErrorsException - C# - Compiler Error: System.Configuration.ConfigurationErrorsException was unhandled c#:System.Configuration.ConfigurationErrorsException(临时文件) - c#: System.Configuration.ConfigurationErrorsException (empity file) System.Configuration.ConfigurationErrorsException - System.Configuration.ConfigurationErrorsException &#39;System.Configuration.ConfigurationErrorsException:请求的数据库WebBank未在配置中定义 - 'System.Configuration.ConfigurationErrorsException: The requested database WebBank is not defined in configuration C#WCF-ConfigurationErrorsException - C# WCF - ConfigurationErrorsException 配置系统无法初始化System.Configuration.dll中发生的“ System.Configuration.ConfigurationErrorsException” - Configuration system failed to initialize 'System.Configuration.ConfigurationErrorsException' occurred in System.Configuration.dll C#app.config问题 - ConfigurationErrorsException:无法识别的元素&#39;setting&#39; - C# app.config problem - ConfigurationErrorsException: Unrecognized element 'setting' System.Configuration.dll中发生“ System.Configuration.ConfigurationErrorsException”,已包含System.Configure - 'System.Configuration.ConfigurationErrorsException' occurred in System.Configuration.dll, System.Configure already included
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM