繁体   English   中英

引用ASP.NET Core服务中的Service Fabric Actor类的编译器错误

[英]Compiler error referencing Service Fabric Actor class from ASP.NET Core service

这整天困扰着我,但我还没有弄清楚为什么会这样。

基本方案

  1. 使用ASP.NET Core服务创建了一个新的Service Fabric应用程序,并增加了对返回MVC视图的支持,以便它可以用作我的SF App的UI。

  2. 在创建UserActorUserActor.Interfaces项目的解决方案中,为用户添加了Actor服务,并确保Interfaces库按SF的要求针对x64。

  3. 在UserActor上定义了一个Task<UserProfile> GetProfileData()方法,其中UserProfile类型是在Interfaces项目中使用[DataContract][DataMember]属性定义的具体类,以便可以对其进行序列化(所有成员都是基元)。

  4. 从ASP.NET Core项目添加了对UserActor.Interfaces的项目引用,因此我可以创建actor代理并调用该方法。

  5. 在ASP.NET Core Controller类中添加了代码以连接到actor实例并调用GetProfileData方法

此时,我收到以下编译器错误:

错误CS0246:找不到类型或名称空间名称'UserProfile'(您是否缺少using指令或程序集引用?)

相关的代码行如下:

using UserActor.Interfaces;

var user = ActorProxy.Create<IUserActor>( new ActorId( model.email ), FabricAppUrl );
UserProfile profile = user.GetProfileData().Result; // compiler error here

如果我将鼠标悬停在最后一行的UserProfile类型上,Visual Studio将向我显示它将类型视为UserActor.Interfaces.UserProfile ,并且在编辑器中不显示任何错误。 只有在我编译时才会出现此错误。

尝试返回原始类型时,我没有收到此错误,并且为Actor Proxy解析IUserActor接口也没有问题。

这是否与Actor项目是标准.NET项目以及ASP.NET Core项目是使用dotnet构建 (设置为.NETFramework,Version = v4.5.2 ;不是dotnet core)进行编译的事实有关

我还在生成输出中注意到,ASP.NET Core项目正在以“调试任何CPU”的形式进行构建,而所有其他项目都设置为“ Debug x64”。 如果这是问题,我希望收到关于不匹配的体系结构类型的错误,但是我也没有得到。

我该如何解决? 我是否应该以其他方式从Actor返回数据(例如将json序列化后再作为字符串基元返回)?

编辑1:

上面的代码示例过于简单。 我看到的2个编译器错误与在同一控制器中传递给helper方法的类型有关,如下所示:

private bool TryGetUserProfile( LoginModel model, out UserProfile profile )
{
    var user = ActorProxy.Create<IUserActor>(new ActorId(model.Email), FarbicAppUrl);
    var profile = user.GetProfileData().Result;

    return !string.IsNullOrEmpty(profile.Name);
}

好的,在另一台计算机上启动整个方案之后,我发现了问题所在,并认为这是Microsoft工具问题。 这里是重现问题的步骤以及需要采取的纠正措施。

  1. 创建一个新的Service Fabric项目,然后选择ASP.NET Core作为服务。 如果出现提示,请选择Web应用程序模板(但是,如果您还选择了Empty或Web API模板,我认为这将是一个问题)。 如果您对此进行调试,那么它将正常工作(前提是您具有本地集群设置)。

  2. 将新的Actor服务添加到解决方案。 这将为您创建UserActorUserActor.Interfaces项目。 如果您此时尝试进行编译,您将收到以下错误消息:

C:\\ Program Files(x86)\\ MSBuild \\ bin \\ Microsoft.Common.CurrentVersion.targets(724,5):错误:未为项目'UserActor.Interfaces.csproj'设置OutputPath属性。 请检查以确保为该项目指定了配置和平台的有效组合。 配置=“调试”平台=“任何CPU”。 如果某个其他项目试图遵循该项目的项目间引用,此项目已被卸载或未包含在解决方案中,并且引用项目未使用相同或等效项构建,则也可能会出现此错误。配置或平台。

检查Configuration Manager显示仅为项目定义了“ x64”目标。 要解决此问题,请使用配置管理器并添加一个新的“ AnyCPU”目标,然后从“ x64”目标中复制它。 由于Service Fabric需要x64程序集,因此在关闭配置管理器之前,请确保接口项目的目标平台仍设置为“ x64”。

  1. 现在,当您进行编译时,您将收到以下错误消息:

C:\\ Program Files(x86)\\ MSBuild \\ Microsoft \\ VisualStudio \\ v14.0 \\ DotNet \\ Microsoft.DotNet.Common.Targets(262,5):错误:C:\\ ... \\ Web错误CS0006:元数据文件'找不到C:\\ ... \\ UserActor.Interfaces \\ bin \\ Debug \\ UserActor.Interfaces.dll'。

这里的线索是,Web项目正在查找为“ AnyCPU”目标定义的OutputPath位置,而不是为“ x64”目标定义的位置(bin \\ x64 \\ Debug)。 如果您手动编辑interfaces项目文件,并将“ AnyCPU”目标的OutputPath设置为与“ x64”目标相同的路径,则所有内容将正确编译。

您还可以部署项目,一切都会正常进行。 我不确定来自Microsoft的哪个目标文件存在问题,但可能两者都有。 我将研究将此问题报告为Microsoft的错误,以期解决该问题(仍与2017年2月3日发布的最新SDK一起存在)。

无法为我找到UserProfile类型的原因是因为UserProfile类添加到项目之前,之前曾使用错误的OutputPath设置构建了解决方案,因此MSBuild正在查看的已编译DLL不包含该类型。 如果我从解决方案中删除了bin和obj文件夹,那么问题出在哪里就变得很明显了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM