从ASP.NET核心服务

时间:2017-02-08 23:05:33

标签: c# asp.net-core azure-service-fabric

这一直困扰着我,我还没弄清楚为什么会这样。

基本情景

  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方法

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

      

    错误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);
    }
    

1 个答案:

答案 0 :(得分:2)

好的,在另一台机器上启动整个场景之后,我发现了问题所在,并认为这是一个Microsoft工具问题。以下是重现问题的步骤以及需要采取哪些措施来纠正问题。

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

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

  3.   

    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程序集。

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

      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文件夹中,问题就在哪里就显而易见了。