把旧系统迁移到.Net Core 2.0 日记 (12) --发布遇到的问题

时间:2022-04-13 07:57:39

1. 开发时是在Mac+MySql, 尝试发布时是在SQL2005+Win 2008 (第一版)

在Startup.cs里,数据库连接要改,分页时netcore默认是用offset关键字分页, 如果用SQL2012之前的版本,就要改

            //-----Use SqlServer, 默认用offset分页(这个是sql2012版本之后才有的功能)
services.AddDbContextPool<CRMContext>(
tt => tt.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection"),
opt=>opt.UseRowNumberForPaging())
);

2. SQL2005 没有datetime2类型, EFCore默认处理datetime是用datetime2类型

            //如果db是SQL2005,没有datetime2的类型.要手工指定
modelBuilder.Entity<Announcement>().Property(t => t.CreateDate).HasColumnType("datetime");
modelBuilder.Entity<Announcement>().Property(t => t.ModifyDate).HasColumnType("datetime");

要批量修改,可以这样写

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
{ foreach (var item in entity.GetProperties())
{
if(item.ClrType.Name== "DateTime")
item.AddAnnotation("Relational:ColumnType", "datetime"); //对应的annotation: [Column(TypeName ="datetime")]
} }

SQL2005没有Merge语句, _context.SaveChanges(); 会出错: System.Data.SqlClient.SqlException (0x80131904): 'MERGE' 附近有语法错误。

TODO: 除非你不用批处理SQL语句,不然还是升级到新版本的SQLServer吧.

3. 发布的目录结构和之前的.net不同

把旧系统迁移到.Net Core 2.0 日记 (12)  --发布遇到的问题

4.  Kestrel 服务器 如何启动?

我们知道.net core我们可以使用dotnet 命令方式去运行 .net core 应用,这种方式使我们的web不再依赖于iis,实现了跨平台。
我们先了解下命令: > dotnet run [options] [[--] arguments]
dotnet run 命令会把我们的项目编译后直接运行,在开发的时候使用,如果是编译好的项目,则使用: > dotnet yourproject.dll [[--] arguments]
如果要更改启动端口,修改Properties\lauchsetting.json的 applicationUrl值

5. 如何发布到IIS7?

把旧系统迁移到.Net Core 2.0 日记 (12)  --发布遇到的问题

需要检查IIS里有没有这2个模块

把旧系统迁移到.Net Core 2.0 日记 (12)  --发布遇到的问题

当前 .NET Core 托管捆绑包安装程序(直接下载)

安装 DotNetCore.2.x.x-WindowsHosting(貌似win2008安装不了,要2008R2以上版本才能安装), 安装DotNetCore SDK, 安装VC  Redist

http://www.cnblogs.com/tianma3798/p/6947287.html

http://www.cnblogs.com/a-dou/p/6685582.html

覆盖发布时,要先停掉之前的站点,才能覆盖

6. NET Core 怎么取得客户端的IP地址呢?

 HttpContext.Connection.RemoteIpAddress.ToString();

7. NET Core 没有Server.MapPath, 可以用IHostingEnvironment

using Microsoft.AspNetCore.Hosting;
public class HomeController : Controller
{
private IHostingEnvironment _host; public HomeController(IHostingEnvironment hostingEnvironment)
{
             _host= hostingEnvironment; 
}
}

_host.ContentRootPath = 项目的根目录
_host.WebRootPath = 项目的WWWRoot目录

另外2种写法:
AppDomain.CurrentDomain.BaseDirectory = {项目根目录}\bin\{Debug|Release}\netcoreapp2.\ PlatformServices.Default.Application.ApplicationBasePath= {项目根目录}\bin\{Debug|Release}\netcoreapp2.0\

8.  NLog.config 发布时要改一下里面的路径. 因为debug时,Log文件是在{project}\Log, config文件路径是{project}\bin\Debug\netcoreapp2.0, 发布时把里面内容改成./Logs

  <!-- the targets to write to -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="allfile" fileName="../../../Logs/nlog-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" /> <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-web" fileName="../../../Logs/nlog-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
</targets>

9. System.Web.HttpUtility.UrlEncode/UrlDecode 在NET Core的替代?

System.Net.WebUtility.HtmlEncode(myString)

10. 未找到与命令“dotnet-ef”匹配的可执行文件

这个是因为服务器端只安装的.net core SDK2.0,没有安装2.1。 要么是安装2.1的SDK;要么在报错的类库里面的xxx.csproj文件里面的ItemGroup里面加上一句

    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1" />

11. 热更新问题. 之前.net可以直接覆盖旧的dll, 但是现在.net core 网站正在运行的时候,不能热覆盖(指windows服务器). 这个方案之前已经有了好多年了.我居然都不知道

在更新网站时,使用"App_Offline.htm“文件 怎样才能在你想更新一个网站的内容,或是对网站做一些大的变动时,不允许用户访问网站,只有在你的操作完成后,才允许用户访问呢?

Asp.Net提供了一个很方便的方法,就是利用”App_Offline.htm"文件。 具体使用方法是,你新建一个名为“App_Offline.htm”的html文档,文档的内容是你在网站关闭时,想让用户看到的内容。
当你更新网站时,如果有用户请求网站,这时Asp.Net会查找有没有App_Offline.html这个文件,如果发现了这个文件,就会关闭网站的应用程序域,并返回App_Offline.html文件的内容。 当你更新完网站后,别忘了把App_Offline.htm文件改名

12.  Request.InputStream改成Request.Body

13.  Request.UserAgent 改成 request.Headers[HeaderNames.UserAgent].toString()

14.  HttpContextBase _httpContext 要改成  IHttpContextAccessor _httpContextAccessor, 并在Startup 里注入.

15. Net Core 控制台输出中文乱码的解决方法:

把旧系统迁移到.Net Core 2.0 日记 (12)  --发布遇到的问题

public static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8;//第一种方式:指定编码
//Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//第二种方式

把旧系统迁移到.Net Core 2.0 日记 (12)  --发布遇到的问题

16.  entity 定义要指定decimal的精度,不然会出来warning

2018-11-22 10:34:10.8966|30000|WARN|Microsoft.EntityFrameworkCore.Model.Validation|No type was specified for the decimal column 'OrderShippingInclTax' on entity type 'Order'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'ForHasColumnType()'.

        [Column(TypeName = "decimal(18, 4)")]
public decimal OrderShippingInclTax { get; set; }

17. controller 的构造函数,不能使用Session, 这样写会得到null

        public EstateController(CRMContext context, PermissionLogic plogic) : base(context,plogic)
{ SysId = (int)HttpContext.Session.GetInt32("LoginSysId"); }

18. The instance of entity type '{{实体}}' cannot be tracked because another instance with the same key value for {'主键'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.

这个是因为dbcontext 查询了同一条记录给了不同的变量,但是EF只能跟踪中的一条. 

你要把其中的一条查询变成AsNoTrack()

var db_Ach = _context.ProjectAchs.Where(t => t.Id == entity.Id).AsNoTracking().FirstOrDefault();

把旧系统迁移到.Net Core 2.0 日记 (12) --发布遇到的问题的更多相关文章

  1. 把旧系统迁移到&period;Net Core 2&period;0 日记 &lpar;15&rpar; --Session 改用Redis

    安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...

  2. 把旧系统迁移到&period;Net Core 2&period;0 日记(1) - Startup&period;cs 解析

    因为自己到开发电脑转到Mac Air,之前的Webform/MVC应用在Mac 跑不起来,而且.Net Core 2.0 已经比较稳定了. 1. 为什么会有跨平台的.Net Core  近年来,我们已 ...

  3. 把旧系统迁移到&period;Net Core 2&period;0 日记 &lpar;17&rpar; --多租户和SoftDelete

    在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilter,它出现的意义在哪里?能够解决什么问题呢? 通过HasQueryFilter方法来创建过滤器能够允许我们对访问特定数据库 ...

  4. 把旧系统迁移到&period;Net Core 2&period;0 日记(10&rpar; -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

  5. 把旧系统迁移到&period;Net Core 2&period;0 日记 &lpar;18&rpar; --JWT 认证(Json Web Token)

    我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...

  6. 把旧系统迁移到&period;Net Core 2&period;0 日记(8&rpar; - EASYUI datagrid&plus; Dapper&plus; 导出Excel

    迁移也没太大变化,有一个, 之前的Request.QueryString 是返回NameValueCollection, 现在则是返回整个字符串. 你要改成Request.Query[“key”] 直 ...

  7. 把旧系统迁移到&period;Net Core 2&period;0 日记(5&rpar; Razor&sol;HtmlHelper&sol;资源文件

    net core 的layout.cshtml文件有变化, 区分开发环境和非开发环境. 开发环境用的是非压缩的js和css, 正式环境用压缩的js和css <environment includ ...

  8. 把旧系统迁移到&period;Net Core 2&period;0 日记(4&rpar; - 使用EF&plus;Mysql

    因为Mac 不能装SqlServer, 所以把数据库迁移到MySql,然后EntityFramework要改成Pomelo.EntityFrameworkCore.MySql 数据库迁移时,nvarc ...

  9. 把旧系统迁移到&period;Net Core 2&period;0 日记(3&rpar; - 详解依赖注入 &lpar;转&rpar;

    关于DI 依赖注入, 转载这篇文章, 写得很好的. ----------------------------- DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关 ...

随机推荐

  1. Objective-c防止数组越界而崩溃(全局效果)

    数组越界其实是很基本的问题,但是解决起来除了count的判断,还有每个调用的时候都要去判断一遍 对于不明确的数据总会有崩溃的风险 然而 每次调用都判断 那是太累了 so ..runtime&c ...

  2. &lbrack;Tool&rsqb; SourceTree初始化GitFlow遇到错误&lpar;git command not found&rpar;的解决方案

    [Tool] SourceTree初始化GitFlow遇到错误(git command not found)的解决方案 问题情景 使用SourceTree,可以方便开发人员快速的套用GitFlow开发 ...

  3. python—基础类的那点儿所以然

    老师说:‘要知其然,更要知其所以然’~~~那么今天就来说点儿所以然,对python中的int,str,lst,dict和tuple等基础类中的方法做一些解析 那么类是什么呢? 官方的解释是这样的:对象 ...

  4. 基于lucene实现自己的推荐引擎

    基于lucene实现自己的推荐引擎 推荐常用算法之-基于内容的推荐 推荐算法

  5. Windows Server 2003下ASP&period;NET无法识别IE11的解决方法

    由于IE11对User-Agent字符串进行了比较大的改动,所以导致很多通过User-Agent来识别浏览器的程序,都相应的出现了无法识别IE11的情况.(普通用户端则可以通过这个方法来进行设置.) ...

  6. wxPython中添加窗口标题图标

    这种添加方法可以避免要将应用程序和图标放在同一个目录,可以实现从模块中读取图标 #用于从module中读取ico,避免了要在程序所在路径附上此ico exeName = win32api.GetMod ...

  7. Logstash 介绍

    Logstash 介绍: Logstash 是一个开源的数据收集引擎具有实时管道能力, Logstash 可以动态的统一数据从不同的来源和使数据规范化到你选择的目的地. 当Logstash 起初驾驭创 ...

  8. java 中缀转后缀(逆波兰)

    import java.util.Stack; public class LeetCode_middleTransformToReversePolish { /** * @param args */ ...

  9. &lbrack;Android学习笔记&rsqb;view的layout过程学习

    View从创建到显示到屏幕需要经历几个过程: measure -> layout -> draw measure过程:计算view所占屏幕大小layout过程:设置view在屏幕的位置dr ...

  10. jQuery获取元素的兄弟节点的几种方法

    $('#id').siblings() //当前元素所有的兄弟节点 $('#id').prev() //当前元素前一个兄弟节点 $('#id').prevaAll() //当前元素之前所有的兄弟节点 ...