当我在在线Acumatica代码编辑器中(而不是在扩展库中)创建CustomizationPlugin类时,即使代码相同,我的OnPublished事件也会针对前者而不是后者触发。 CustomizationPlugins是否可以在扩展库中工作?无论类的内容如何,它都会发生,但是我将发布一些示例源...
//Customization plugin is used to execute custom actions after customization project was published
public class WebConfigurator : CustomizationPlugin
{
private Configuration _WebConfig;
private Configuration WebConfig
{
get
{
if (_WebConfig == null)
{
_WebConfig = WebConfigurationManager.OpenWebConfiguration("~");
}
return _WebConfig;
}
}
//This method executed right after website files were updated, but before website was restarted
//Method invoked on each cluster node in cluster environment
//Method invoked only if runtimecompilation is enabled
//Do not access custom code published to bin folder, it may not be loaded yet
public override void OnPublished()
{
this.WriteLog("OnPublished Event");
SetAppSetting("DataPublisher:LoginPath", "auth/login");
WebConfig.Save();
}
protected void SetAppSetting(string key, string value)
{
AppSettingsSection appSettingSection = (AppSettingsSection)WebConfig.GetSection("appSettings");
if (appSettingSection.Settings.AllKeys.Contains(key))
{
appSettingSection.Settings[key].Value = value;
}
else
{
appSettingSection.Settings.Add(key, value);
}
}
//This method executed after customization was published and website was restarted.
public override void UpdateDatabase()
{
this.WriteLog("UpdateDatabase Event");
}
}
答案 0 :(得分:1)
CustomizationPlugin继承者只有在进入App_RuntimeCode文件夹时才会执行。如果创建.dll文件,将不会执行。与CustomizationPlugin继承者有关的所有内容都只能执行一次。要记住的另一个细节是,如果将web.config文件中的UseRuntimeCompilation密钥设置为False,则平台将使用App_Code / Caches文件夹,而不是App_RuntimeCode,并且继承者也不会执行。默认情况下,UseRuntimeCompilation设置为true。
答案 1 :(得分:0)
您是否有理由不使用UpdateDatabase()方法作为插件的入口点?
我觉得这可能是因为您正在修改web.config文件。我建议尽可能避免这种情况。修改web.config会触发一连串的事件,并在IIS端进行重新编译,并且由于我们已经处于发布和重新编译IIS文件的上下文中,因此由于零星的锁定文件冲突,这可能导致IIS服务器行为不确定和挂起。>
我还没有测试OnPublished
方法,因为我没有测试它,但是我不知道UpdateDatabase
有什么限制,所以我通过从内部创建一个新库进行了简单的测试定制项目编辑器:
然后我在库项目中添加了PX.Web.Customization.dll
程序集,因为它需要引用Customization
类型。
该项目是我所能做到的准系统,它包含一个名为Test.cs的源代码文件:
using Customization;
using System;
namespace Test
{
public class Test : CustomizationPlugin
{
public override void UpdateDatabase()
{
throw new Exception();
}
}
}
然后我编译该库(调试模式),将编译后的DLL文件粘贴到我的Acumatica实例的Bin文件夹中。然后,我创建了一个新的完全空的定制项目。在“文件”部分中,使用+按钮添加“ Test.dll”库文件,保存项目,然后执行“使用清理发布”。
请注意,该项目不包含任何运行时代码,仅包含1个库文件。在发布控制台窗口中,我看到它执行了Test定制插件并停止了,因为它确实捕获了我从插件中抛出的异常: