这一直困扰着我,我还没弄清楚为什么会这样。
基本情景
使用ASP.NET Core服务创建了一个新的Service Fabric应用程序,并添加了对返回MVC视图的支持,以便它可以充当我的SF App的UI。
为创建UserActor
和UserActor.Interfaces
项目的解决方案的用户添加了一项Actor服务,并确保Interfaces库根据SF的要求定位x64。
在UserActor上定义了一个Task<UserProfile> GetProfileData()
方法,其中UserProfile
类型是Interfaces项目中定义的具有[DataContract]
和[DataMember]
属性的具体类,以便它可以被序列化(所有成员都是原始的)。
从ASP.NET Core项目添加了对UserActor.Interfaces
的项目引用,因此我可以创建actor代理并调用该方法。
在ASP.NET Core Controller类中添加了代码以连接到actor实例并调用GetProfileData
方法
此时,我收到以下编译器错误:
错误CS0246:类型或命名空间名称&#39; UserProfile&#39;找不到(你错过了使用指令或汇编引用吗?)
相关的代码行如下:
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代理的IUserActor
接口也没有问题。
这是否与Actor项目是标准.NET项目以及使用 dotnet build 编译ASP.NET Core项目有关(设置为 .NETFramework,Version = v4.5.2 ;不是dotnet核心。)
我还在构建输出中注意到,ASP.NET核心项目正在构建为“调试任何CPU”。而所有其他项目都设置为&#39; Debug x64&#39;。如果这是问题,我希望收到关于不匹配的架构类型的错误,但我也没有得到。
我该如何解决这个问题?我应该以不同的方式从Actor返回数据(例如json序列化它,然后将其作为字符串原语返回)?
修改1:
上面的代码示例太简单了。我看到的2个编译器错误是在同一控制器中传递给辅助方法的类型,如下所示:
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);
}
答案 0 :(得分:2)
好的,在另一台机器上启动整个场景之后,我发现了问题所在,并认为这是一个Microsoft工具问题。以下是重现问题的步骤以及需要采取哪些措施来纠正问题。
创建一个新的Service Fabric项目并选择ASP.NET Core作为服务。如果出现提示,请选择Web应用程序模板(但我认为如果您也选择了Empty或Web API模板,这将是一个问题)。如果您调试它,它将正常工作(假设您有本地群集设置)。
向解决方案添加新的Actor服务。这将为您创建UserActor
和UserActor.Interfaces
项目。如果此时尝试编译,您将收到以下错误消息:
C:\ Program Files(x86)\ MSBuild \ bin \ Microsoft.Common.CurrentVersion.targets(724,5):error:没有为项目&#39; UserActor.Interfaces设置OutputPath属性。的csproj&#39 ;.请检查以确保您为此项目指定了Configuration和Platform的有效组合。配置=&#39;调试&#39;平台=&#39; AnyCPU&#39 ;.如果某个其他项目正在尝试遵循项目到项目对此项目的引用,此项目已卸载或未包含在解决方案中,并且引用项目不使用相同或等效项目构建,则也可能出现此错误配置或平台。
检查配置管理器显示只有一个&#39; x64&#39;为项目定义的目标。要解决此问题,请使用配置管理器并添加新的&#39; AnyCPU&#39;定位并从&#39; x64&#39;中复制它。目标。确保目标平台仍设置为&#39; x64&#39;关闭Configuration Manager之前的接口项目,因为Service Fabric需要x64程序集。
C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ DotNet \ Microsoft.DotNet.Common.Targets(262,5):错误:C:\ ... \ Web错误CS0006:元数据文件&#39; C:\ ... \ UserActor.Interfaces \ bin \ Debug \ UserActor.Interfaces.dll&#39;无法找到。
这里的线索是,Web项目正在查找为“AnyCPU”定义的OutputPath位置。目标而不是为&#39; x64&#39;定义的位置。 target(bin \ x64 \ Debug)。如果您手动编辑interfaces项目文件并为&#39; AnyCPU&#39;设置OutputPath。定位到与&#39; x64&#39;相同的路径目标,一切都会正确编译。
您也可以部署项目,一切都将按预期工作。我不确定微软的哪个目标文件存在问题,但它可能都是。我希望将此报告为Microsoft的一个错误,希望能够解决它(仍然存在于2017年2月3日发布的最新SDK)。
我无法找到UserProfile
类型的原因是因为我之前使用错误的OutputPath集构建了解决方案我添加了UserProfile
项目的类,所以MSBuild正在查看的编译DLL没有包含该类型。如果我删除了bin&amp;从解决方案的obj文件夹中,问题就在哪里就显而易见了。