zoukankan      html  css  js  c++  java
  • Net Core 2.X和Net 4.X的功能升级迁移和Bug处理笔记

    最近在迁移一些Net 4.X的项目到Net Core 2.X上,  遇到一些代码层面调用方法和类库的修改,这里记录一些我遇到并比较常用的功能点。备查。

    其实一些问题stackoverflow上都有解答。算是中文搬运吧(手动滑稽,护住狗头)

     PS:MVC 生命周期EF Core 文档  MVC防伪

    https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/lifecycle-of-an-aspnet-mvc-5-application

    https://docs.microsoft.com/en-us/ef/core/what-is-new/roadmap

    https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-2.1

    通用:

    Q:App.Cinfig或Web.Config的ConnectionString或AppSetting读取:

      在Net 4.X下我们可以直接通过ConfigurationManager访问到Web.Config或App.Config里的配置项。

                string connstr = ConfigurationManager.ConnectionStrings["name"].ConnectionString;
                string appvalue = ConfigurationManager.AppSettings["RedisPassword"];

    其实在Net Core 2.X里同样是可以访问到的,只需要安装NuGet包 :System.Configuration.ConfigurationManager 就OK.(VS默认的开发模版并未依赖)

     Q:Sql Server Geometry类型 Model 反射问题:

      note:EF Core 2.2已经完善解决方式并解决/可视情况更新: https://docs.microsoft.com/zh-cn/ef/core/modeling/spatial

      在Net 4.X框架里,集成了Geometry类型.所以用一些ORM转换SQL 为dynamic 时,可以通过。但是net core 2.x暂时没有集成,需要在T-Sql里对 几何类型调用 ToString() 转换

    MVC/WEBAPI相关:

    Q.Net Core 和 Net 4.X 的 Route 和 Area相关:

      Net Core里已经不再区分WebAPI和MVC控制器和路由注册,Area的路由注册也集中到了Configure的UseMvc中注册,不再像Net4.x再Area目录里配置

      Note:需要注意的是在Net4.X中,在调用RouteMap时配置 namespaces防止Area控制器与Controller目录重名的问题.

            而NetCore中,已经移除了namespaces 参数则是AreaAttribute特性进行约束:

        [Area("TestArea")]
        public class HomeController : Controller
        {
            public IActionResult Index()
            {
                return View();
            }
        }

    例子:

    Net4.X:

      

      以RouteConfig.cs文件为例:

        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    namespaces: new string[] { "WebApplication2.Controllers" } 
                );
            }
        }

    Net Core 2.X:

            public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {try
                {
                    #region 其他常用配置

              #endregion #region MVC 和WebAPI 相关 app.UseMvc(routes => { // MVC routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); // WebAPI routes.MapRoute("WebAPI", "api/{controller=Test}/{action=HelloNetCore}/{id?}"); // Area routes.MapAreaRoute(name: "TestArea", areaName:"TestArea",template: "TestArea/{controller}/{action}"); }); #endregion } catch (Exception ex) { } }

    Q.Net Core 和Net 4.X 的Cookie:

    Net4.X的Cookie是一个HTTPCookie类,现在的话Net Core 直接是个字符串数组了。

    最加Net Core 2.1后,默认不允许使用Cookie了,理由和决解方案:

    https://www.cnblogs.com/GuZhenYin/p/9154447.html

    获取:

    Net4.X

    HttpCookie cookie = HttpContext.Current.Request.Cookies["key"];

    Net Core 2.X

    string cookie = HttpContext.Request.Cookies["key"];

    删除(PS:删除Cookie的最佳方式是设置Cookie过期):

    Net 4.X

    HttpContext.Current.Response.Cookies.Remove("key");

    Net Core 2.X:

    HttpContext.Response.Cookies.Delete("key");

    创建:

    Net4.X:

    var cookie = new HttpCookie("key", "value")
    {
        HttpOnly = true,
        Secure = FormsAuthentication.RequireSSL,
        Path = "/",
        Expires = DateTime.Now.AddYears(10)
    };
    
    HttpContext.Current.Response.Cookies.Add(cookie);

    Net Core 2.X:

    HttpContext.Response
                .Cookies
                .Append("key", "value", new CookieOptions
                {
                    HttpOnly = true,
                    Secure = true,
                    Path = "/",
                    Expires = DateTime.Now.AddYears(10)
                });

     

    Q:静态文件包相关:

      Net 4.X的JS和CSS的插件(Jquery和Bootstrap之类)一般都是直接包含引用或通过NuGet包安装/在Config里配置,维护管理成本其实很高。

      然后Net Core里不在推荐使用以前的前端依赖管理.

      静态类的文件推荐使用Bower/npm/yarn进行前端依赖的安装管理。虽然加大的学习成本。但是面对现在日益庞大的前端功能。这种管理静态文件的方式转变还是很有必要的。

      以为例:

        Bower在MVC Core 中的使用:

        首先确认电脑安装好Node.js(当前稳定版本8.9.X)

        然后安装Bower 这里是全局安装

    npm install -g bower

        用VS 2017创建一个空的MVC项目,并Init Bower.在MVC项目根目录,用命令行,并根据步骤填写相关信息:

    bower init

      然后手动在MVC项目目录下创建一个.bowerrc 文件。

      并把如下配置复制到文件里。然后工程就算建好了。

    {
      "directory": "wwwroot/lib"
    }

     

     在bower.json里。我们可以根据自己的需要安装相关的Package包

    然后通过

    bower init

    命令 进行安装

    Q.IHttpModule和IHttpHandler在MVC中的实现:

    Net Core把IHttpModule和IHttpHandler都整合到了中间件.文档阐述的比较详细,就不贴栗子了.

     文档: https://docs.microsoft.com/en-us/aspnet/core/migration/http-modules?view=aspnetcore-2.1

    Q.ActionFilterAttribute过滤器 访问Controller :

    wait edit

    Q.Controller Request和Response 获取Url:

    wait edit

    Q.MVC/WebAPI:Antiforgery防伪 (防XSRF/CSRF攻击):

    防伪的变化不是很大,以前是过滤器,现在改成了注入中间件

     扩展阅读:https://odetocode.com/blogs/scott/archive/2017/02/06/anti-forgery-tokens-and-asp-net-core-apis.aspx

                    #region 页面防伪
                    services.AddAntiforgery(opt =>
                    {
                        opt.Cookie.Name = "QING-ANTIFORGERY-TOKEN";
                        opt.HeaderName = "QING-X-ANTIFORGERY-TOKEN";
                        opt.Cookie.SecurePolicy = CookieSecurePolicy.None;
                        opt.Cookie.HttpOnly = false;
                        opt.SuppressXFrameOptionsHeader = false;
                    });
                    #endregion
                    app.Use(next => context =>
                    {var tokens = antiforgery.GetAndStoreTokens(context);
                            context.Response.Cookies.Append("QING-X-ANTIFORGERY-TOKEN", tokens.RequestToken,
                                new CookieOptions() { HttpOnly = false });
                        return next(context);
                    });
        function getCookie(cname) {
            var name = cname + "=";
            var decodedCookie = decodeURIComponent(document.cookie);
            var ca = decodedCookie.split(';');
            for (var i = 0; i < ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0) == ' ') {
                    c = c.substring(1);
                }
                if (c.indexOf(name) == 0) {
                    return c.substring(name.length, c.length);
                }
            }
            return "";
        }
    
    
            var csrfToken = getCookie("QING-X-ANTIFORGERY-TOKEN");
            console.log(csrfToken);
            var xhttp = new XMLHttpRequest();
    
    
            xhttp.onreadystatechange = function () {
                if (xhttp.readyState == XMLHttpRequest.DONE)
                {
                    if (xhttp.status == 200) {
                        alert(xhttp.responseText);
                    } else {
                        alert('There was an error processing the AJAX request.');
                    }
                }
            };
            xhttp.open('POST', '/home/test', true);
            xhttp.setRequestHeader("Content-type", "application/json");
            xhttp.setRequestHeader("QING-X-ANTIFORGERY-TOKEN", csrfToken);
            xhttp.send();

    Q.MVC/WebAPI:WebSocket支持示例:

     Net Core :

      一对一:

    Q.MVC/WebAPI:SignalR支持示例:

       wait

  • 相关阅读:
    【网易官方】极客战记(codecombat)攻略-地牢-健忘的宝石匠
    【网易官方】极客战记(codecombat)攻略-地牢-深藏的宝石
    【网易官方】极客战记(codecombat)攻略-地牢-Kithgard 地牢
    【网易官方】极客战记(codecombat)攻略[地牢]:祸之火焰-通关代码及讲解
    spring可以接收的正则的方式
    Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
    EnableRetry
    https://www.youtube.com/watch?v=kwuu1efzkf4 38分
    https://gitee.com/createmaker/reactor-examples reactor编程代码
    webflux 20201011
  • 原文地址:https://www.cnblogs.com/linqing/p/8881249.html
Copyright © 2011-2022 走看看