2 Replies Latest reply: Dec 10, 2012 4:37 PM by Daniel Lipkie RSS

    QMSAPI v10SR5 vs V11SR2 ServiceKeyBehaviorExtensionElement

    Daniel Lipkie


      Using QMSAPI from V10SR5 I built an app that was able to inject a service key using the following in my app.config

       

      <behaviorExtensions>
              <add name="serviceKeyBehavior" type="TerraTechnology.AnalyticModuleLoader.ServiceKeyBehaviorExtensionElement, AnalyticModuleLoader"/>
      </behaviorExtensions>

       

      Note that the "type=..." is NOTa fully qualified assembly name; it does not have Version=xxx, Culture=xxx, PublicKeyToken=xxx.

       

      It appears that when I use v11SR2 and I try to use the above abbreviated assembly qualifier I get an error:

       

      An exception occurred: An error occurred creating the configuration section handler for system.serviceModel/behaviors: Extension element 'serviceKeyBehavior' cannot be added to this element.  Verify that the extension is registered in the extension collection at system.serviceModel/extensions/behaviorExtensions.

       

      If I use a fully qualified assembly description in the app.config

       

      <behaviorExtensions>
              <add name="serviceKeyBehavior" type="TerraTechnology.AnalyticModuleLoader.ServiceKeyBehaviorExtensionElement, AnalyticModuleLoader, Version=4.2.4716.29448, Culture=neutral, PublicKeyToken=null"/>
      </behaviorExtensions>

       

      I do not get an error.

       

      I am wondering if there was a change in the way QMSAPI tries to create an instance of the type specified in the behaviorExtensions between v10 and v11.

        • Re: QMSAPI v10SR5 vs V11SR2 ServiceKeyBehaviorExtensionElement
          Daniel Lipkie

          Invoke the folloiwng before any QMSAPI calls. It will update the in-memory configuration information to the current assembly version and avoid the exception in this discussion.

          public UpdateServeKeyBehaviorType()
          {
            Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            ServiceModelSectionGroup smGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);
            ExtensionElementCollection extensions = ServiceModelSectionGroup.GetSectionGroup(configuration).Extensions.BehaviorExtensions;
            ExtensionElement behavior = extensions["serviceKeyBehavior"];
            //myNameSpace.ServiceKeyBehaviorExtensionElement, myAssembly, Version=1.0.4723.26787, Culture=neutral, PublicKeyToken=null
            string oldType = behavior.Type;
            string newType = oldType.Substring(0, oldType.IndexOf("Version=") + 8) + AssemblyVersion() + oldType.Substring(oldType.IndexOf(", Culture"));
            behavior.Type = newType;
            configuration.Save();
          }

          public string AssemblyVersion()
          {
            string[] pieces = Assembly.GetEntryAssembly().FullName.Split(new char[] { '=', ',' });
            return (pieces.Count() > 2 ? pieces[2] : string.Empty);
          }

            • Re: QMSAPI v10SR5 vs V11SR2 ServiceKeyBehaviorExtensionElement
              Daniel Lipkie

              Bug in .NET 3.5

               

              The behaviorExtension for QMSAPI serviceKeyBehavior must be be strongly typed, i.e. must contain Version/Culture/PublicKeyToken that exactly match the assembly. No extra spaces allowed. Version etc must be specified.

               

                <behaviorExtensions>
                  <add name="serviceKeyBehavior" type="MyNamespace.ServiceKeyBehaviorExtensionElement, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
                </behaviorExtensions>

               

              This causes problems when the version of the assembly is autoincremented during assembly compile/build.

              Fixed in .NET 4.0. Version/Culture/PublicKeyToken may be dropped so that the config no longer needs the autoincremented value of the version.

               

                <behaviorExtensions>
                  <add name="serviceKeyBehavior" type="MyNamespace.ServiceKeyBehaviorExtensionElement, MyAssembly"/>
                </behaviorExtensions>