当C#表达式使用引用类型时,活动引发异常
我有一个基本的“任务”活动。它从父序列的输入变量中获取值,并将它们放入父序列的输出变量中。如果我只是执行此复制操作,则一切正常,工作流也会成功完成。如果引入系统类型“Random”或项目枚举“ReportStatusType”,工作流将引发异常“抛出system.NotSupportedException:“表达式活动类型'CSharpValue'1'需要编译才能运行。” 我根据wf 4的一个示例创建了此工作流。我想我正在使用wf 4.5。我正在VS2013中工作,目标是.NET Framework 4.5。我使用了使用IIS平台的“WCF工作流服务应用程序”模板。我正在使用“WCF测试客户端”调用服务并查看响应 此值表达式适用于:当C#表达式使用引用类型时,活动引发异常,c#,workflow-foundation-4,C#,Workflow Foundation 4,我有一个基本的“任务”活动。它从父序列的输入变量中获取值,并将它们放入父序列的输出变量中。如果我只是执行此复制操作,则一切正常,工作流也会成功完成。如果引入系统类型“Random”或项目枚举“ReportStatusType”,工作流将引发异常“抛出system.NotSupportedException:“表达式活动类型'CSharpValue'1'需要编译才能运行。” 我根据wf 4的一个示例创建了此工作流。我想我正在使用wf 4.5。我正在VS2013中工作,目标是.NET Framewo
new ExpenseReportConfirmation() {
Amount = report.Amount,
City = report.Amount,
Client = report.Client,
Employee = report.Employee,
EndDate = report.EndDate,
StartDate = report.StartDate,
ReportID = 5
};
此值表达式失败:
new ExpenseReportConfirmation() {
Amount = report.Amount,
City = report.Amount,
Client = report.Client,
Employee = report.Employee,
EndDate = report.EndDate,
StartDate = report.StartDate,
ReportID = new Random().Next(0,5),
};
我导入的名称空间如下所示:
如果我尝试在另一个赋值活动中创建ReportID,然后在上面所示的值表达式中引用它,这也会失败
这对我来说可能是一个新手错误,但我没有主意。其他人有吗?C#表达式必须编译,而VB表达式没有
编译Xaml
编译后的XAML工作流支持C#表达式,这些工作流被编译为以.NET Framework 4.5为目标的C#工作流项目的一部分。编译后的XAML是Visual Studio中工作流创作的默认类型,在Visual Studio中创建的以.NET Framework 4.5为目标的C#工作流项目使用C#表达式
松散Xaml
松散XAML工作流支持C#表达式。加载和调用松散XAML工作流的工作流宿主程序必须以.NET Framework 4.5为目标,并且CompileExpressions
必须设置为true(默认值为false).若要将CompileExpressions设置为true,请创建一个ActivityXamlServicesSettings
实例,将其CompileExpressions
属性设置为true,并将其作为参数传递给System.Activities.XamlIntegration.ActivityXamlServices.Load(System.IO.Stream)
如果未将
CompileExpressions
设置为true,将引发NotSupportedException,并显示类似以下消息:表达式活动类型“CSharpValue”“1”需要编译才能运行。请确保已编译工作流
C#表达式必须编译,而VB表达式则不需要
编译Xaml
编译后的XAML工作流支持C#表达式,这些工作流被编译为以.NET Framework 4.5为目标的C#工作流项目的一部分。编译后的XAML是Visual Studio中工作流创作的默认类型,在Visual Studio中创建的以.NET Framework 4.5为目标的C#工作流项目使用C#表达式
松散Xaml
松散XAML工作流支持C#表达式。加载和调用松散XAML工作流的工作流宿主程序必须以.NET Framework 4.5为目标,并且CompileExpressions
必须设置为true(默认值为false).若要将CompileExpressions设置为true,请创建一个ActivityXamlServicesSettings
实例,将其CompileExpressions
属性设置为true,并将其作为参数传递给System.Activities.XamlIntegration.ActivityXamlServices.Load(System.IO.Stream)
如果未将
CompileExpressions
设置为true,将引发NotSupportedException,并显示类似以下消息:表达式活动类型“CSharpValue”“1”需要编译才能运行。请确保已编译工作流
发件人:
XAMLX工作流服务中支持C#表达式。当
工作流服务托管在IIS或WAS中,因此不需要执行其他步骤
必需,但如果XAML工作流服务是自托管的,则#
必须编译表达式。若要在
自托管XAMLX工作流服务,首先将XAMLX文件加载到
WorkflowService,然后将WorkflowService的主体传递给
使用C编译上一篇文章中描述的Expressions方法#
“代码工作流”部分中的表达式。在以下示例中
加载XAMLX工作流服务,编译C#表达式,然后
然后打开工作流服务并等待请求
因此,您可以:
// Load the XAMLX workflow service.
WorkflowService workflow1 =
(WorkflowService)XamlServices.Load(xamlxPath);
// Compile the C# expressions in the workflow by passing the Body to CompileExpressions.
CompileExpressions(workflow1.Body);
// Initialize the WorkflowServiceHost.
var host = new WorkflowServiceHost(workflow1, new Uri("http://localhost:8293/Service1.xamlx"));
// Enable Metadata publishing/
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
// Open the WorkflowServiceHost and wait for requests.
host.Open();
Console.WriteLine("Press enter to quit");
Console.ReadLine();
选项2-使用自定义主机工厂(可能更简单、更直接)
现在将工厂添加到web.config:
<system.serviceModel>
<serviceHostingEnvironment>
<serviceActivations>
<add relativeAddress="WcfWorkflow.xalmx" service="WcfWorkflow.xalmx" factory="Namespace.CSharpWorkflowServiceHostFactory" />
</serviceActivations>
</serviceHostingEnvironment>
</system.serviceMode>
来自:
XAMLX工作流服务中支持C#表达式。当
工作流服务托管在IIS或WAS中,因此不需要执行其他步骤
必需,但如果XAML工作流服务是自托管的,则#
必须编译表达式。若要在
自托管XAMLX工作流服务,首先将XAMLX文件加载到
WorkflowService,然后将WorkflowService的主体传递给
使用C编译上一篇文章中描述的Expressions方法#
“代码工作流”部分中的表达式。在以下示例中
加载XAMLX工作流服务,编译C#表达式,然后
然后打开工作流服务并等待请求
因此,您可以:
// Load the XAMLX workflow service.
WorkflowService workflow1 =
(WorkflowService)XamlServices.Load(xamlxPath);
// Compile the C# expressions in the workflow by passing the Body to CompileExpressions.
CompileExpressions(workflow1.Body);
// Initialize the WorkflowServiceHost.
var host = new WorkflowServiceHost(workflow1, new Uri("http://localhost:8293/Service1.xamlx"));
// Enable Metadata publishing/
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
// Open the WorkflowServiceHost and wait for requests.
host.Open();
Console.WriteLine("Press enter to quit");
Console.ReadLine();
选项2-使用自定义主机工厂(可能更简单、更直接)
现在将工厂添加到web.config:
<system.serviceModel>
<serviceHostingEnvironment>
<serviceActivations>
<add relativeAddress="WcfWorkflow.xalmx" service="WcfWorkflow.xalmx" factory="Namespace.CSharpWorkflowServiceHostFactory" />
</serviceActivations>
</serviceHostingEnvironment>
</system.serviceMode>
此问题与编译C#表达式无关,因为我在IIS下部署该服务并由它处理编译。此问题在阅读后得到解决。我的赋值活动值是这样编写的,并且在Random()函数
new ExpenseReportConfirmation() { Amount = report.Amount, City = report.City, Client = report.Client, Employee = report.Employee, EndDate = report.EndDate, StartDate = report.StartDate, ReportID = new Random().Next(0, 50) };