Release Notes
SelectByTemplate Auto-Save
The GenericObject class in QBO offers a SelectByTemplate method to enforce repeatability. Two recent changes were introduced that can have unexpected consequences for existing installations:
Background QBO has always supported the concept of templated repeatability as:
For example, one can defined a DecisionTemplate called "Invoice Client" as one active per parent where calling Decision/Save?Object=Organization&ObjectID=1&Template=Invoice Client will result in:
However, the following method signatures did not abide by repeatability rules: Decision/Save?Object=Organization&ObjectID=1&DecisionTemplate=Invoice Client Decision/Sa ve?Object=Organization&ObjectID=1&DecisionTemplateID=X This exposed a bug in the ITemplate.CreateInstance pattern, where the {Table}TemplateID property was being set, instead of TemplateID , causing repeatability to be ignored when creating generic objects from workflows.The fix for this now supports methods signature using {Table}Template or {Table}TemplateID , but in turn exposed another bug:SetProperties?Object=Organization&ObjectID=1&DecisionTemplateID=X triggers a Save call. Normally, this save call has no effective impact, because SelectByTemplate is almost always called from Save anyway. However, when adding a Message from the UI, Message/Merge is called, which in turn calls Message/SelectByTemplate , which triggered a Save on the Merge , even if a user never clicks Save .Given the broad impact of removing the SelectByTemplate Save call, this change has been feature-switched:qbo.Application.Properties.Settings.SelectByTemplateAutoSave = false If this change results in undesirable behavior of a given installation, take the following steps:
|
Object Queue Performance Update
ObjectQueue has been updated to address performance issues. The following objects have been updated:
ObjectQueue contention was causing deadlocks for:
which resulted in stalled workflows and overall database contention. Please ensure the above updates are deployed together to avoid any performance issues. |
Workflow Advanced Step Update
DecisionStep.cs has been updated so that Advanced Steps fully support async processing:
By converting to async, this allows for the Method Signature of the Custom Query (DecisionStepTemplate.Method) to be invoked async. This also allows for batch steps to wire async. Threading is now managed by using SemaphoreSlim class and a set number of threads must be specified. qbo.Decision settings has been extended to contain: BatchStepTheadCount - Default thread count for processing advanced steps. Value is defaulted to 5 threads. |
ITemplate Update
The following QBO3 ITemplate method signatures have been extended: CreateInstance (GenericObject parent, IDictionary<string, object> parameters)CreateInstanceAsync (GenericObject parent, IDictionary<string, object> parameters)Both have been extended to include a Parent parameter that allows for accessibility to the Parent for optional actions. This is a breaking change: All classes that implement ITemplate must be re-complied against this change to work. Do not deploy qbo.Application.dll without also deploying all other modules.All modules that implement ITemplate have been updated. The first use case was a bug fix in DecisionTemplate to address stalled workflows:
|
Case Insensitive QBO URLs
QBO has been updated to support cases insensitive URLs and parameters. While not a breaking change, the change is deep enough that it includes a feature switch to enable/disable the functionality: qbo.Application.Properties.Settings.CaseSensitiveMethodSignature , which defaults to false .To leverage the feature switch, instead of calling: new Dictionary<string, object>() code should instead call: new Parameters() The Parameters class constructor sets the StringComparer based on the CaseSensitiveMethodSignature. Beyond that, the functionality is equivalent to IDictionary<string, object>.The changes to enable this include:
|
qbo.Security.PasswordCompliance - Plugin Extensible Password Rules Enforcement
The Security module has been updated with a robust "password rules enforcement" piece under the namespace qbo.Security.PasswordCompliance. You can use these features out-of-the-box, using the default settings. Key Features:
SVN:
Successful Deployment checks:
New tests have been added to qbo.Security.Tests in relation to this new functionality. |
MVC-Style Custom Routing
IEncryptionKey
The qbo.Application module has been extended to support an IEncryptionKey interface and associated configuration. The Credential class has been extended to leverage the IEncryptionKey settings to symmetrically encrypt or decrypt Credential.Password . The Credential behavior is:
This means that the Credential when persisted to ConfigurationEntry will contain an EncryptedPassword string that must be decrypted with the same key used to encrypt the Password .The qbo.Encryption.Amazon (found in the qbo.Amazon solution) can be used to leverage an AWS KMS key for encryption and decryption. |
Newtonsoft.JSON Nuget Package Updates
The qbo.Core.sln is being updated to include references to Newtonsoft.Json version 11+. This mandates an updated to web.config: <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" /> </dependentAssembly> ... </assemblyBinding> </runtime> If you miss this update, you will received an error message along these lines: Developers should check any plugin-based solutions to ensure the current version of Newtonsoft.Json is referenced (currently v11.0.2). If you fail to update a plugin solution, and deploy it after deploying core, you will deploy an older version of Newtonsoft.Json (e.g. v10), causing the reverse of the above error. |
1-10 of 58