Net46之上的asp.net Core/EF Core应用



我有一个MVC6网站,它必须在完整的。net框架之上运行,因为它依赖于尚未更新以支持。net Core的各种库。

我想我可能错误地配置了这个项目。json文件。我有:

{
  "dependencies": {
    "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0",
    "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1",
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.Extensions.Caching.Memory": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Serilog": "2.2.1",
    "Serilog.Sinks.RollingFile": "3.0.1",
    "Serilog.Sinks.Literate": "2.0.0",
    "Serilog.Extensions.Logging": "1.2.0",
    "AutoMapper": "5.1.1",
    "WindowsAzure.Storage": "7.2.1",
    "Microsoft.Azure.WebJobs": "1.1.2",
    "Microsoft.WindowsAzure.ConfigurationManager": "3.2.1",
    "UploadFramework": "1.0.0-*",
    "ConnellDataCore": "1.0.0-*",
    "ConnellData": "1.0.0-*",
    "System.IO.Compression": "4.1.0",
    "BundlerMinifier.Core": "2.2.281"
},
  "tools": {
    "BundlerMinifier.Core": "2.0.238",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    "Microsoft.Extensions.SecretManager.Tools": "1.0.0-preview2-final",
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": [
        "portable-net45+win8"
      ]
    }
  },
  "frameworks": {
    "net46": { }
  },
  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },
  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },
  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "appsettings.json",
      "web.config"
    ]
  },
  "scripts": {
    "prepublish": [ "bower install", "dotnet bundle" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

这个依赖的所有项目都是建立在Net46之上的。有项目。Json文件都有这样的条目:

  "frameworks": {
    "net46": {
      "frameworkAssemblies": {
        "System.Configuration": "4.0.0.0"
      }
    }
  }

尽管在这个特定的例子中,我合并了frameworkAssemblies条目,因为我需要访问ConfigurationManager(如果这不是解决这个问题的正确方法,请建议)。

这是配置asp.net Core/EF Core应用程序在Net46上运行的正确方法吗?如果没有,我需要改变什么?

<

附加信息/strong>

我遇到的问题涉及System.IO.Compression程序集。具体来说,发生的事情是,我的解决方案建立,但每当网站试图访问ZipArchive时,它就崩溃了。因为System.IO.Compression.dll没有部署到站点的bin目录(有趣的是,System.IO.Compression.Zip.dll 被部署到,但它对System.IO.Compression.dll不起作用)。

我通过手动复制System.IO.Compression到网站的bin文件夹来"解决"这个问题。但是,当网站发布时,手动复制的DLL不会部署到Azure,因此基于Azure的网站会出现相同的崩溃问题。

为了解决这个问题,我查阅了所有不同的项目,并检查了System.IO.Compression dll的文件版本。我发现了一个奇怪的现象:我的附属项目(网站所依赖的)中包含的System.IO.Compression DLL是从NetCore程序集缓存部署的,而不是标准的Net4.6缓存。

我不知道这是什么意思。但我认为这可能与我遇到的问题有关。

我的目标是确保>>no<<项目从Net Core部署任何程序集。

不幸的是,我不知道该怎么做。我怀疑这个问题涉及到一些参考,也许是asp.net Core本身,它坚持/默认使用。Core程序集。但我不知道如何告诉它不要。

未被复制的dll与。net核心无关,我不确定问题是什么,dll没有复制,因为在您的代码中没有直接引用它。System.IO.Compression.Zip.dll被复制是因为在代码的某个地方,您正在实例化对象或从该dll调用静态方法。

当实体框架6发布时,他们将SqlServer提供程序移动到一个单独的dll中,并且由于没有人在代码中直接引用它,因此没有部署它,所以到处都是问题。

Rob Lang有一个关于他的冒险和最终解决方案的有趣阅读:

var ensureDLLIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

在使用本地报告部署应用程序时,我也看到了所有SqlServer Data Type dll的类似问题,在那里我采取了不同的方法,直接在web项目中引用dll(有很多)并将它们设置为复制本地true,我相信只要dll在发布或部署的项目中被引用,它们也会被复制到输出文件夹中。但是如果它们被发布/部署的项目引用的类库引用,它们就不会被引用。

最新更新