【发布时间】:2017-06-26 19:00:01
【问题描述】:
这一直困扰着我一整天,我还没有弄清楚为什么会发生这种情况。
基本场景
使用 ASP.NET Core 服务创建了一个新的 Service Fabric 应用程序,并添加了对返回 MVC 视图的支持,以便它可以充当我的 SF 应用程序的 UI。
在创建
UserActor和UserActor.Interfaces项目的解决方案中为用户添加了Actor 服务,并确保接口库按照SF 的要求以x64 为目标。在 UserActor 上定义了一个
Task<UserProfile> GetProfileData()方法,其中UserProfile类型是在 Interfaces 项目中定义的具有[DataContract]和[DataMember]属性的具体类,以便它可以被序列化(所有成员都是原语)。从 ASP.NET Core 项目中添加了对
UserActor.Interfaces的项目引用,以便我可以创建参与者代理并调用该方法。在 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 代理的 IUserActor 接口也没有问题。
这是否与 Actor 项目是标准 .NET 项目和 ASP.NET Core 项目是使用 dotnet build 编译的事实有关(设置为 .NETFramework,Version =v4.5.2;不是 dotnet 核心)。
我还在构建输出中注意到 ASP.NET Core 项目正在构建为“调试任何 CPU”,而所有其他项目都设置为“调试 x64”。如果这是问题所在,我预计会收到关于架构类型不匹配的错误,但我也没有收到。
我该如何解决这个问题?我是否应该以不同的方式从 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);
}
【问题讨论】:
-
您是否尝试将
UserProfile替换为var? -
UserProfile 类是否标记为公开?
-
@kalten using var sorta 有帮助,但编译器调用的行是我尝试将类型传递给同一控制器中的另一个方法的地方(上面的示例有所简化)。在我的问题中添加了另一个示例。
-
@LoekD 是的,该类是一个标准的公共类,其构造函数(不是默认值)以
[DataContract]为属性,多个 get/set 自动属性为[DataMember]。 -
你在project.json中有这个吗? "运行时":{ "win10-x64":{} },
标签: c# asp.net-core azure-service-fabric