当前位置: 首页 > news >正文

四川省城乡建设信息网站证件查询ueeshop和wordpress

四川省城乡建设信息网站证件查询,ueeshop和wordpress,厚街网站建设费用,深圳企业黄页网点击蓝字关注我现在越来越多的人在谈论. NET Core。诚然#xff0c;.NET Core 是未来, 但是.NET Framework 仍在支持, 因为大量的应用程序无法在短时间内迁移。.NET Core 和 .NET Framework 就像电动汽车和汽油动力汽车。汽油车是成熟的#xff0c;你可以毫无任何问题驾驶它.NET Core 是未来, 但是.NET Framework 仍在支持, 因为大量的应用程序无法在短时间内迁移。.NET Core 和 .NET Framework 就像电动汽车和汽油动力汽车。汽油车是成熟的你可以毫无任何问题驾驶它但电动车有它们的优势并正在取代汽油车。所以不要误会你应该从今天开始迁移到. NET Core。长文预警我已经迁移了几个运行在完整.NET Framework和IIS上的传统ASP.NET/MVC项目到ASP.NET Core 2.x可以运行在IIS或非IIS环境下。我的博客是其中之一。这是一个有10年历史的博客系统最初由 ASP.NET 2.0 Web Form以及Visual Basic编写。从2008年起我一直在面向最新的.NET技术更新代码库。.NET Core版本的博客系统将在今年年底到来。我写这篇文章记录我遇到的路障和如何解决它们的方法。这篇文章针对的是新接触.NET Core但有.NET Framework经验的开发人员帮助他们将现有的应用更平滑的过渡到.NET Core上。 1迁移或重写有时候我更喜欢用“重写“而不是”迁移“这个词因为在有些情况下.NET Core和.NET Framework是完全不同的两个东西。根据我的经验大部分前端代码可以只做少量修改就直接移植到.NET Core因为它们的本质毕竟是服务器技术无关的天生跨平台的技术。至于后端代码迁移成本取决于它们对Windows及IIS的耦合程度。我理解有些应用会充分利用Windows 及 IIS 的特性这样开发者就可以避免自己费力去实现一些功能。这些包括计划任务、注册表、活动目录或Windows服务等。这些并不能够直接迁移因为.NET Core是跨平台的。对于这些部分你可能需要考虑从重新设计业务逻辑想一种可以实现相同功能但不依赖于Windows 或IIS 组件的方法。对于无法迁移的历史遗留代码你可能需要考虑重新设计整个应用的架构将这些功能作为REST API暴露出来可以使用.NET Framework上的ASP.NET Web API来实现。这样的话你的ASP.NET Core 应用得以继续使用这些API并继续完成业务功能。即使你的应用使用了WCF服务甚至更老的 ASMX 服务也是可以搞的。因为.NET Core目前有WCF客户端可以调用WCF。2NuGet 包管理请确保你需要使用的NuGet包支持 .NET Core 或 .NET Standard。如果不支持那么你需要研究有没有可以替换的NuGet包或者你是否能够自己写代码去实现相同的功能。.NET Standard 意味着这个包可以同时使用在.NET Framework 4.6.1 以及.NET Core这是取代老的 Portable Class Library (PCL)的技术。所以如果你看到一个包的依赖项里有.NET Standard这意味着你能够将它安装到你的.NET Core工程中。部分包比如NLog有专门的.NET Core版本比如 NLog.Web.AspNetCore你应该选择使用这样的版本。你依然可以在.NET Core工程里引用一个.NET Framework的包但是这会让你的应用只能跑在Windows上不推荐这么做。我列出了一些热门使用的NuGet 包它们都已经支持.NET CoreNLog.Web.AspNetCoreNewtonsoft.JsonHtmlAgilityPackRestSharpNUnitDapperAutoMapperMoq对于客户端包比如 jQuery请不要使用NuGet 将它们安装到.NET Core工程中参见本文的 “客户端包管理” 章节。如果你使用 Visual Studio Code 做 .NET Core 开发请注意安装NuGet包的命令不是 Install-Package那是给Visual Studio的 PowerShell host用的在VSCode里你需要使用dotnet CLI工具比如dotnet add package Newtonsoft.Json参见 https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-add-package3客户端包管理ASP.NET Core 曾经使用 Bower 去管理客户端包。但在最新的ASP.NET Core 2.1 里Bower 已经被移除了因为作者不干了。因此微软默认使用自家的包管理器 “Library Manager” 也叫 “libman” 去管理前端包。它能够在 Visual Studio 和 Visual Studio Code 中使用甚至也能用 CLI 在命令行下使用。libman.json 可以直接编辑也能在UI中更改都有智能感知支持。我的建议是如果你的应用不是重客户端的话使用 libman 去管理前端包因为其他技术比如NPM 太重量级了。你会希望在你的编译服务器上安装和配置NodeJS以及其他一切东西仅仅为了拉取一个jQuery 库。更多详情可参见官方文档 https://docs.microsoft.com/en-us/aspnet/core/client-side/libman/?viewaspnetcore-2.14Html / JavaScript / CSS你可以直接将这些文件复制到.NET Core工程里。但是请确保你已经把文件路径修改正确比如CSS里的图片文件路径。因为传统ASP.NET / MVC 模板默认使用 “/Content/” 目录而.NET Core模板使用“/css/”, “/js/”, “/lib/” 等目录这并不是强制的只是约定俗成的规范。如果你希望捆绑并压缩CSS 和JS 文件有许多工具可以办到。我个人喜欢用VS的一款插件叫做 “Bundler Minifier” 你可以从这里获取https://github.com/madskristensen/BundlerMinifier.这款插件可以在开发时生成捆绑及压缩的文件但非编译或运行时。5App_Data 文件夹在传统ASP.NET/MVC 应用中你可以将数据文件保存到一个名为“App_Data”的特殊文件夹中但这个东西在.NET Core里不复存在了。为了实现类似的功能你需要自己创建一个名为“App_Data” 的文件夹但位于“wwwroot”目录之外。然后像这样使用public void Configure(IApplicationBuilder app, IHostingEnvironment env){    // set    string baseDir env.ContentRootPath;    AppDomain.CurrentDomain.SetData(DataDirectory, Path.Combine(baseDir, App_Data));     // use    var feedDirectoryPath ${AppDomain.CurrentDomain.GetData(DataDirectory)}\\feed;}6自定义 Http Headers在传统ASP.NET里你可以在Web.Config 里像这样为每个响应都配置自定义的HTTP HeaderhttpProtocol  customHeaders    add nameX-Content-Type-Options valuenosniff /  /customHeaders/httpProtocol而在.NET Core里如果你希望脱离Windows去部署你的应用不可以使用Web.config文件。因此你需要一个三方的 NuGet 包来完成这个功能NetEscapades.AspNetCore.SecurityHeadersapp.UseSecurityHeaders(new HeaderPolicyCollection()    .AddCustomHeader(X-UA-Compatible, IEedge)    .AddCustomHeader(X-Developed-By, Edi Wang));详情参考 https://github.com/andrewlock/NetEscapades.AspNetCore.SecurityHeaders7获取客户端IP地址以及 HttpContext在传统ASP.NET 里我们能够通过 Request.UserHostAddress 来获取客户端IP地址。但这个属性在 ASP.NET Core 2.x 里是不存在的。我们需要通过另一种方式获取HTTP 请求信息。1. 在你的 MVC 控制器里定义一个私有变量private IHttpContextAccessor _accessor;2.  使用构造函数注入初始化它public SomeController(IHttpContextAccessor accessor){    _accessor accessor;}3. 获取客户端IP地址_accessor.HttpContext.Connection.RemoteIpAddress.ToString()就是如此简单。如果你的 ASP.NET Core 工程是用MVC默认模板创建的针对HttpContextAcccessor 依赖注入注册应该在Startup.cs 中完成services.AddHttpContextAccessor();services.TryAddSingletonIActionContextAccessor, ActionContextAccessor();RemoteIpAddress 的类型是 IPAddress 并不是string。它包含 IPv4, IPv6 以及其他信息。这和传统ASP.NET不太一样对我们更加有用一些。如果你希望在Razor 视图(cshtml) 里使用只需要用 inject 指令注入到view中inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor使用方法:Client IP: HttpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString()8JsonResult默认情况下ASP.NET Core 会使用 camelCase 序列化 JsonResult 而传统 ASP.NET MVC 使用的是PascalCase这会导致依赖Json结果的 JavaScript 代码爆掉。例如以下代码public IActionResult JsonTest(){    return Json(new { Foo 1, Goo true, Koo Test });}它会返回camelCase 的Json给客户端如果你有大量JavaScript 代码并不能及时改为使用camelCase你仍然可以配置 ASP.NET Core 向客户端输出 PascalCase 的Jsonpublic void ConfigureServices(IServiceCollection services){    // Add framework services.    services.AddMvc()        .AddJsonOptions(options options.SerializerSettings.ContractResolver new DefaultContractResolver());}现在之前的代码会返回PascalCase 的结果1HttpModules 和 HttpHandlers这两者在ASP.NET Core中被替换为了 Middleware。但在迁移之前你可以考虑使用别的方法在一个普通ASP.NET Core Controller 中实现这些功能。例如我的老博客系统里有个名为“opml.axd” 的HttpHandler 作用是向客户端输出一个XML文档这其实完全可以用 Controller 来实现public async TaskIActionResult Index(){    var opmlDataFile ${AppDomain.CurrentDomain.GetData(Constants.DataDirectory)}\\opml.xml;    if (!System.IO.File.Exists(opmlDataFile))    {        Logger.LogInformation($OPML file not found, writing new file on {opmlDataFile});         await WriteOpmlFileAsync(HttpContext);        if (!System.IO.File.Exists(opmlDataFile))        {            Logger.LogInformation($OPML file still not found, something just went very very wrong...);            return NotFound();        }    }     string opmlContent await Utils.ReadTextAsync(opmlDataFile, Encoding.UTF8);    if (opmlContent.Length 0)    {        return Content(opmlContent, text/xml);    }     return NotFound();}我也曾经使用HttpHandler 完成Open SearchRSS/Atom等功能它们也能够被 重写为Controller。对于其他一些不能够被重写为MVC Controller的组件例如处理特殊拓展名的请求。请参见:https://docs.microsoft.com/en-us/aspnet/core/migration/http-modules?viewaspnetcore-2.110IIS URL Rewrite你依然可以使用和旧应用里完全一样的配置文件不管你的 .NET Core 应用是否部署在IIS上。例如在应用根目录底下创建一个名为UrlRewrite.xml的文件内容如下rewrite  rules    rule nameRedirect Misc Homepage URLs to canonical homepage URL stopProcessingfalse      match url(index|default).(aspx?|htm|s?html|php|pl|jsp|cfm)/      conditions logicalGroupingMatchAll trackAllCapturesfalse        add input{REQUEST_METHOD} patternGET/      /conditions      action typeRedirect url//    /rule  /rules/rewrite注意你必须把这个文件设置为always copy到输出目录不然无效ItemGroup  None UpdateUrlRewrite.xml    CopyToOutputDirectoryAlways/CopyToOutputDirectory  /None/ItemGroup打开 Startup.cs在Configure 方法中添加如下代码public void Configure(IApplicationBuilder app, IHostingEnvironment env){    ...    using (var urlRewriteStreamReader File.OpenText(UrlRewrite.xml))    {        var options new RewriteOptions().AddIISUrlRewrite(urlRewriteStreamReader);        app.UseRewriter(options);    }    ...}这在我之前的文章中提到过https://edi.wang/post/2018/9/18/prevent-image-hotlink-aspnet-core.更多选项和用法可以参考 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/url-rewriting?viewaspnetcore-2.111Web.configWeb.config 文件并没有完全消亡。在 In .NET Core 里一个 web.config 文件仍然用于在IIS环境下部署网站。在这种场景下Web.config 里的配置仅作用于 IIS和你的应用代码没有任何关系。可以参考 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/index?viewaspnetcore-2.1#configuration-of-iis-with-webconfig一个典型的IIS下部署ASP.NET Core应用的web.config 文件如下?xml version1.0 encodingutf-8?configuration  location path. inheritInChildApplicationsfalse    system.webServer      handlers        add nameaspNetCore path* verb* modulesAspNetCoreModule resourceTypeUnspecified /      /handlers      aspNetCore processPathdotnet arguments.\Moonglade.Web.dll stdoutLogEnabledfalse stdoutLogFile\\?\%home%\LogFiles\stdout /    /system.webServer  /location/configuration曾经的 AppSettings 节点可迁移到 appsettings.json在这篇文章中有详解https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?viewaspnetcore-2.112Session 和 CookieASP.NET Core 默认没有开启Session支持你必须手工添加Session 支持。services.AddDistributedMemoryCache();services.AddSession(options {    options.IdleTimeout TimeSpan.FromMinutes(20);    options.Cookie.HttpOnly true;});以及app.UseSession();设定和获取Session值HttpContext.Session.SetString(CaptchaCode, result.CaptchaCode);HttpContext.Session.GetString(CaptchaCode);清除值context.Session.Remove(CaptchaCode);详情参见https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?viewaspnetcore-2.113Html.Action我们曾经使用 Html.Action 去调用一个Action 返回一个Partial View 然后放在主要的View 中显示比如layout页。这在Layout页面中的应用非常广泛比如在一个博客系统中显示分类列表之类的小部件。Html.Action(GetTreeList, Category)在ASP.NET Core里它被替换为了 ViewComponents参见 https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components一个要注意的地方是Invoke方法只能是 async 签名的async TaskIViewComponentResult InvokeAsync()但如果你的代码并不是天生异步的为了不让编译器警报你可以加入这行代码await Task.CompletedTask;14检查运行环境是 Debug 或 Release在我的老系统里我使用 HttpContext.Current.IsDebuggingEnabled 去检查当前运行环境是否为Debug并在标题栏上显示 “(Debug)” 字样。if (HttpContext.Current.IsDebuggingEnabled){    text(Debug)/text}在 ASP.NET Core 里我们可以使用新的razor tag helper 去完成这件事environment includeDevelopment    (Debug)/environment在下面的章节里你会看到更多razor tag helper 的用法。15新的Razor Tag HelpersTag helper 可以帮助你讲老的HTML helper 简化为更加面向HTML可读的代码例如一个表单我们曾经要这样写转换为 Tag Helpers 的结果是这样的我个人最喜欢的功能是给JS或CSS文件自动增加版本字符串script src~/js/app/ediblog.app.min.js asp-append-versiontrue/script它的结果是script src/js/app/ediblog.app.min.js?vlvNJVuWBoD_RVZwyBT15T_i3_ZuEIaV_w0t7zI_UYxY/script新的razor 语法能够兼容以前的 HTML helpers也就是说你依然能在ASP.NET Core中毫无问题的使用老的 HTML helpers。如果你的应用迁移时间紧迫你可以尽管先使用老代码随后再逐步转换到Tag Helpers。完整的介绍和语法列表可参见https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?viewaspnetcore-2.116Anti-Forgery TokenAnti-forgery token 有一些改进。首先你能够自定义cookie 以及字段的名字了。services.AddAntiforgery(options {    options.Cookie.Name X-CSRF-TOKEN-MOONGLADE;    options.FormFieldName CSRF-TOKEN-MOONGLADE-FORM;});第二你再也不需要手工给每一个表单都增加这行代码了Html.AntiForgeryToken()如果你使用新的form tag helper那么anti-forgery 字段会自动在输出到客户端时自动加上。但你依然需要在后台对应的Action上加上 [ValidateAntiForgeryToken] 属性。然而有另一种自动给每一个POST请求都验证anti-forgery token 的办法。services.AddMvc(options options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));或者你可以单独给一个 Controller 加上这个属性。[Authorize][AutoValidateAntiforgeryToken]public class ManageController : Controller17对非Controller 使用依赖注入ASP.NET Core 有自带的 DI 框架可以用在 Controller 上。我们可以修改一个Controller 的构造函数去注入它运行所依赖的服务。public class HomeController : Controller{    private readonly IDateTime _dateTime;     public HomeController(IDateTime dateTime)    {        _dateTime dateTime;    }}但这不意味着自带的DI框架只能用在Controller 上。对于其他类你可以使用完全一样的DI例如我自定义的类也可以使用构造函数注入public class CommentService : MoongladeService{    private readonly EmailService _emailService;     public CommentService(MoongladeDbContext context,        ILoggerCommentService logger,        IOptionsAppSettings settings,        EmailService emailService) : base(context, logger, settings)    {        _emailService emailService;    }          // ....}方法是只要你把自定义的类注册到Startup.cs中的 DI 容器里即可。services.AddTransientCommentService();更多ASP.NET Core 依赖注入的使用方法参见 https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/dependency-injection?viewaspnetcore-2.118API 行为不一致有些来自传统 ASP.NET 的代码可以无错误编译通过但这不保证运行时能够成功。比如这段来自ASP.NET (.NET Framework) 的代码在 ASP.NET Core 中会抛出异常var buffer new byte[context.Request.Body.Length];context.Request.Body.Read(buffer, 0, buffer.Length);var xml Encoding.Default.GetString(buffer);它的结果是System.NotSupportedException: Specified method is not supported.at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.get_Length()在.NET Core里我们需要用一种不同的方式去实现var xml await new StreamReader(context.Request.Body, Encoding.Default).ReadToEndAsync();19小心GDPR 带来的问题ASP.NET Core 2.1 默认添加了 GDPR 的支持但也会给我们带来一些问题。关于GDPR可参见 https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?viewaspnetcore-2.1主要问题是在用户接受GDPR协议之前Cookie 是不起作用的。你需要检查哪些Cookie是你应用运行所必须的即时用户没有接受GDPR协议并且把它们标记为IsEssential这是我博客系统中的一个例子private void SetPostTrackingCookie(CookieNames cookieName, string id){    var options new CookieOptions    {        Expires DateTime.UtcNow.AddDays(1),        SameSite SameSiteMode.Strict,        Secure Request.IsHttps,         // Mark as essential to pass GDPR        // https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?viewaspnetcore-2.1        IsEssential true    };     Response.Cookies.Append(cookieName.ToString(), id, options);}另一个问题是如果你要使用Session那么用户必须接受GDPR 策略否则 Session是不工作的。因为 Session 需要依赖 Cookie 在客户端保存 SessionID 。20热更新 Views在传统 ASP.NET MVC 中Views 文件夹默认不会编译到 DLL 文件中所以我们能够不需要编译整个应用就能更新razor页面。这在不需要更新C#代码的情况下仅修改文字或一些layout修改的场景下非常实用。我有时候也利用这个特性直接向生产环境发布一些修改后的页面。然而ASP.NET Core 2.1 默认情况下会将我们的 Views 编译到DLL 中以提高性能。因此你无法在服务器上直接修改一个视图因为文件夹中根本就不存在 Views只有一个 *.Views.dll如果你仍然希望在ASP.NET Core中热更新Views需要手工修改csproj文件PropertyGroup  TargetFrameworknetcoreapp2.1/TargetFramework  RazorCompileOnBuildfalse/RazorCompileOnBuild  RazorCompileOnPublishfalse/RazorCompileOnPublish/PropertyGroup21编译版本号自增长在传统 .NET 应用程序里我们可以修改 “AssemblyInfo.cs” 在每次编译时自动增加版本号。这在编译服务器里十分常用。[assembly: AssemblyVersion(9.0.*)]结果是这样9.0.6836.29475不幸的是.NET Core 目前还没有一个自带的方法来完成这个操作。只有一个三方解决方案可能有用https://github.com/BalassaMarton/MSBump能看到这里的都是我的真爱粉啊……结束ASP.NET Core 相对传统 ASP.NET 有了不少区别目前也有一定的限制。本文仅涵盖了我自己所遇到的问题也一定还有很多我没有遇到过的情况。欢迎留言或Email给我交流你的发现。
http://www.zqtcl.cn/news/901053/

相关文章:

  • 购物网站那个信用好又便宜手机模板的网站
  • 建筑企业资质查询网站怎么查网络服务商
  • 汉川市城乡建设局网站企业销售网站建设
  • 梅州建设网站域名购买流程
  • 单页网站与传统网站的区别wordpress对接微信
  • 做公司网站深圳旅游
  • 最好企业网站网站建设 的销售图片
  • 怎么创建网站 免费滴做网站算运营吗
  • 廊坊网站建设-商昊网络正规网站优化推广
  • 网站建设拍金手指排名贰贰安装wordpress数据库错误
  • 食品网站建设需求分析购物app大全
  • 电商美工广州seo技术外包公司
  • 重庆旅游seo整站优化深圳宝安区是富人区吗
  • 网站开发验收模板网站欧美风格
  • 自己做发卡网站什么是网络设计制作
  • 如何搭建一个公司网站互联网推广怎么找客户
  • 江苏同隆建设集团有限公司网站asp.net新建网站
  • 爱站网挖掘工具小程序网站开发怎么样
  • 网站文章批量上传工具自己制作免费网站
  • 凡科快速建站建设网站遇到问题的解决方案
  • 深圳市公司网站建设公司十大互联网营销公司
  • 免费发布推广信息的网站百度招聘2022年最新招聘
  • 建站公司怎么获客任县附近网站建设价格
  • 泰兴市淘宝网站建设指数 网站权重
  • 烟台市做网站找哪家好才艺多网站建设
  • nginx wordpress 重写seo技术大师
  • 公司网站建设需要什么科目上海服务政策调整
  • 如何免费搭建自己的网站网站建设公司swot分析
  • 太原网站优化技术如何开发一款app软件
  • 莆田做网站公司lnmp wordpress 404