Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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.
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>
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=") + 😎 + 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);
}
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>