目前我有一个与我的自定义工作流协作的 ASP.NET 网络表单应用程序。我正面临来自 ASP.NET 的 httpcontext 和活动上下文(NativeActivityContext)之间的线程计时问题。
我的工作流具有实现 SqlWorkflowInstanceStore 的持久性能力。
下面的代码是我工作流程中的一项活动,它执行页面导航之类的操作,并通过扩展名(PageNavigationExtension)返回所需页面的 url。
protected override void Execute(NativeActivityContext context)
{
string bookmarkName = this.BookmarkName.Get(context);
string urlPage = this.UrlPage.Get(context);
bool createBookmark = this.CreateBookmark.Get(context);
if (urlPage == null)
{
throw new ArgumentException(
string.Format("UrlPage {0}: UrlPage can't be null",
this.DisplayName), "UrlPage");
}
if (bookmarkName == null)
{
throw new ArgumentException(
string.Format("Bookmark {0}: BookmarkName can't be null",
this.DisplayName), "Bookmark");
}
innerExecute(context);
if (createBookmark)
context.CreateBookmark(bookmarkName, new BookmarkCallback(ResumerBookmark)); ;
}
private void innerExecute(NativeActivityContext context) {
PageNavigationExtension extension =
context.GetExtension<PageNavigationExtension>();
if (extension != null)
{
extension.Url = UrlPage.Get(context);
extension.ObjToReturn = ObjToReturn.Get(context);
}
}
void ResumeBookmark(NativeActivityContext context, Bookmark bookmark, object state)
{
bool action = (bool)state;
if (action == true) {
PageNavigationExtension extension =
context.GetExtension<PageNavigationExtension>();
if (extension != null)
{
extension.Url = UrlPage.Get(context);
extension.ObjToReturn = ObjToReturn.Get(context);
}
}
else
{
PageNavigationExtension extension = context.GetExtension<PageNavigationExtension>();
context.SetValue(base.Result, action);
context.SetValue(ObjToReturn, extension.ObjToReturn);
}
}
下面显示的这部分是我的 ASPX 页面的一部分,它恢复到活动(代码如上所示)。
public string directNavigate(string bMarkName) {
WorkflowApplication workflow = GetWorkflow(null);
workflow.Load(this.WorkflowID);
workflow.ResumeBookmark(bMarkName, true);
return pageNaviExtension.Url;
}
问题发生在我在“directNavigate”函数中恢复书签时,活动上下文没有调用“ ResumeBookmark
”BookmarkCallback 委托,直到“ return pageNaviExtension.Url;
”行,acititycontext 线程才转到“”行bool action = (bool)state;
“ ResumeBookmark
”书签回调委托。
简而言之,这意味着我无法在“ return pageNaviExtension.Url;
”行期间通过我的活动返回页面 url,并且最后我的 ASPX 页面的 HttpContext 线程退出“ directNavigate
”函数而没有页面 url。