修复迁移后Net Standard项目中的错误

接上一章,项目编译结果如下:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

解决依赖dll引用

在Net Framework项目的引用如下:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

各引用和作用:

  • log4net(1.10.0.0) 用于写框架日志

  • Castle.DynamicProxy(1.1.5.1) 用于代理类生成

  • Micosoft.Practice.EnterpiseLibrary 微软企业库,用于管理数据链接和缓存的功能

  • System.Data.OracleClient 用于链接Oracle数据库

  • System.Data 用于SQL SERVER 、OLeDB、ODBC的数据库操作

这些老的项目引用是不能直接用在Net Standard项目上的,解决过程如下:

  • [解决] log4net是开源项目,从2.0.6 版开始就已经支持.NET Core,目前是2.0.8,在在开源网站和nuget上可以下载到。通过nuget引用最新的dll,可以无缝兼容

  • [解决] Castle.DynamicProxy也是一个开源的项目,他也具有.NET Core版本对应的DLL(Castle.Core),只是接口和我引用的1.1.5.1的接口有一点点区别,可以调整一点代码解决,同时把老项目的dll也引用最新的dll即可。

  • [移除相关的代码]Micosoft.Practice.EnterpiseLibrary 企业库微软已经很早不支持了,也没有对应的Core版本,我的做法是检查下代码看看这些代码是否能去掉,或用别的方式来实现。

  • System.Data.OracleClient Net Core官方没有出dll来实现,但是有社区已经实现了对应的dll. 目前我没有验证这个功能,只是将相关的类不编译。

  • System.Data 这个参考下面的章节,来解决,因为之前这个dll包含了oledb、odbc、sqlserver的数据库。目前微软有Syste.Data.SqlClient.dll来兼容sql server的其他的都不支持。

新项目的引用截图:

640?wx_fmt=png

数据库相关的错误修订

MS Sql Server

Net 和 MS Sql Server交互大多通过Syste.Data.SqlClient.dll中相关类操作,在Core项目中,项目中通过引用Nuget中的 System.Data.SqlClient包,即可修复。

OleDB 和 ODBC

Net Core\Standard不再支持System.Data.OleDb。
目前没有找到相关 Net Core\Standard 中官方有相关的类库来替代。
所以在编译Net Core\Standard项目时,通过项目文件去除相关类。

移除编译的方式很简单,使用文本编辑器,打开.csproj文件:
之前我们通过添加一下配置,将代码以快捷方式添加到新项目中

   <ItemGroup><Compile Include="..\..\Beyondbit.Framework\**\*.cs" /></ItemGroup>

将我们不需要的功能排除掉,使用以下语法:

 <ItemGroup><Compile Remove="..\..\Beyondbit.Framework\Data\OdbcDbClientProvider.cs" /><Compile Remove="..\..\Beyondbit.Framework\Data\OleDbDbClientProvider.cs" /></ItemGroup>

通过上面,新项目中,就不会出现OdbcDbClientProvider.cs文件,而老项目还有的。通过这种方式排除和olddb和odbc相关的类。

Oracle

Net Core\Standard不再支持System.Data.OracleClient。
微软没有提供相关类库来支持,但是有开源社区有实现的版本OracleClientCore ,可以在Nuget 中下载,这个我没有试过是否有效。

修复配置文件读取的错误

Web.config  App.config

在Net Core 2.0 以后是支持App.config的,在之前Net Core 中的配置不能像我们在Net Frameword中那样读取配置。 2.0之前Net Core读取配置的方法,可以参考LizeZere 同学的文章《ASP.NET Core开发-读取配置文件Configuration》和晓晨Master同学的文章《.NET Core 配置Configuration杂谈》

在Net Core\Standard中是没有web.config的概念,No ConfigurationManager in ASP.NET Core,没错.net core 不支持了。
不过可以采取变通的方式来解决,参考binbinxu同学的文章解决《.NET CORE 2.0 踩坑记录之ConfigurationManager》,验证是有效的。

App.config 读取BUG

实测使用System.Configuration.ConfigurationManager 4.4.1 版本读取配置时,在Web项目或者控制台应用,都可以顺利读取。但我在vs2017创建的MSUnit的测试项目运行集成测试时,读取失败了。目前还没找到方法解决,后续我会反馈BUG在github上。

编译时报“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute”错误的解决办法

当创建 .NET Core/Standard 2.0项目时,VS不会像.NET Framework项目一样自动生成AssemblyInfo.cs文件。
而且,若是手工在项目中加入以前写好的 AssemblyInfo.cs 文件,编译时会报告“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute”错误.

参考zyl910同学的文章解决,验证有效。

修复HttpContext问题

在我们的老项目,代码里面可能会判断当前是否在Web环境下,会读取一些以前特定的代码,这个问题是最难处理的。如以下代码:

可以看到编译提示HttpContext在老项目可以,在新项目显示不可用,并出现红线。这是因为在NetCore中System.Web的命名空间不在包含HttpContext类了。通过查询一些文章,有很多的文章都描述了如何在Net Core下,模拟HttpContext.Current的。如:

  • 《在.net Core 中像以前那样的使用HttpContext.Current》

  • 《ASP.NET Core开发之HttpContext》

等等文章。
但是它们都提到了需要在Startup类通过ioc注入东西,我的项目只是一个类库,他可以运行在任何环境下,我该如何在类库中使用HttpContext,并且我不想更改代码。搜索了国内和国外的网站,都没有一个很好的方案。我自己琢磨了一个临时的方案:

  • 在Nuget引用Microsoft.AspNetCore.Http库,这是net core中HttpContextBase的库

  • 在我的新项目类顶级命名空间下,创建一个静态类叫HttpContext,里面具有一个Current的属性,返回NetCore中的HttpContext,代码如下:

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Text;

namespace Beyondbit.Framework{  
 public class HttpContext{    
    private static IHttpContextAccessor _accessor;    
    
       public static Microsoft.AspNetCore.Http.HttpContext Current => _accessor.HttpContext;      
       public static void Configure(IHttpContextAccessor accessor)                    {_accessor = accessor;}} }
  • 修改代码将System.Web.HttpContext.Current这样的代码改成 HttpContext.Current并引用System.Web命名空间

  • 这样同样的代码即可在老项目编译通过,同时新项目也能编译通过

  • 目前这样是可以编译通过,但是 HttpContext.Current是null. 需要在 mvc core项目中的Startup类中,调用一下Beyondbit.Framework.HttpContext.Configure()方法,将httpConetxt的注入到类库中

HttpContext.Current.Session问题

Net Core中的Session类和Net Framework的类变动非常的大,而且接口都已经变更,比如在Net Framework中HttpContext.Current.Session["Key"] 来获取一个object类型的变量,但是在Net Core中这样是不行的,Session已经不支持[]的写法,HttpContext.Current.Session.TryGetValue,或者扩展方法HttpContext.Current.Session.Get,但这个接口默认返回的是byte[]类型,或者HttpContext.Current.Session.GetString这样的方法获取。
这样的代码已经和Net Framework无法兼容。

目前无奈的做法是:

  1. 修改代码去除session的读取,这个需要根据具体功能来调整,不能一概去除,要不然影响原来的功能

  2. 通过条件编译,来使得net core项目不支持这些功能,而老项目编译时依然支持, 在新项目中添加条件编译的标志NETSTANDARD2_0,然后典型的代码如下:

                if (HttpContext.Current == null)              
                     return "";#if NETSTANDARD2_0throw new NotSupportedException();#elsereturn HttpContext.Current.Session.SessionID;#endif

NotSupportedException类是我添加的一个异常类,用来在遇到我们想项目时调用了一些我们临时去掉的功能,可以很明显告诉我们代码的问题在哪里

SqlCommandBuilder

目前这个类只能利用条件编译先解决。

编译结果已经全部OK了,可以看到我的编译结果

640?wx_fmt=png

总结
第二步的工作是来消灭错误,目前已经全部完成,第三步是迁移单元测试和集成测试项目,以及最终的多个平台运行的测试。

原文地址 :http://www.cnblogs.com/xakoy/p/8891375.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迁移Net项目为Net Core\Standard项目

背景&#xff1a;我们公司内部有自己ORM开发框架&#xff0c;最新因为需要将系统迁移到国产服务器上&#xff0c;所以首先需要将最基础的ORM框架改造可以运行在国产服务器上。对于我们Net来说&#xff0c;优选Net Core。在迁移的过程中&#xff0c;将一些经验和坑记录下来&…

迁移后的Net Standard版本的类库测试和多平台项目实测

按照第一步的方法&#xff0c;添加一个Net Core的MSTest项目&#xff0c;然后将原来的测试项目下的代码迁移到新测试 项目中&#xff0c;然后引用新的Beyondbit.Framework Core类库。然后运行单元测试项目和集成测试项目即可。测试当中单元测试下项目没有问题&#xff0c;一遍就…

.Net Core小技巧 - 使用Swagger上传文件

前言随着前后端分离开发模式的普及&#xff0c;后端人员更多是编写服务端API接口。调用接口实现文件上传是一个常见的功能&#xff0c;同时也需要一个选择文件上传的界面&#xff0c;可以编写前端界面上传&#xff0c;可以使用Postman、curl来模拟上传请求。上述的方式多多少少…

容器化分布式日志组件ExceptionLess的Angular前端UI

写在前面随着微服务架构的流行&#xff0c;日志也需要由专门的分布式日志组件来完成这个工作&#xff0c;我们项目使用的是 ExceptionLess 这个组件&#xff0c;它是前后端分离的&#xff1b;这篇文章我们就来实践容器化 ExceptionLess 的前端&#xff0c;并为其包含一个 nginx…

EF 6.x、EF Core实现dynamic动态查询和EF Core实现多个上下文实例池你了解多少?

前言很长一段时间没有写博客了&#xff0c;今天补上一篇吧&#xff0c;偶尔发现不太愿意写博客了&#xff0c;太耗费时间&#xff0c;不过还是在坚持当中&#xff0c;毕竟或许写出来的东西能帮到一些童鞋吧&#xff0c;接下来我们直奔主题。无论是在在EF 6.x还是EF Core中对于原…

1、play编程基础

1、Action、Controller、Result Action指的是动作&#xff0c;play中大多数请求可以使用action来处理&#xff0c;一个请求对应一个动作也就是一个java方法&#xff0c;然后处理请求返回一个响应&#xff0c;这个响应用Result来体现 Controller就是一个继承了 play.mvc.Contro…

【动态规划】城市交通

城市交通 Description 有n个城市&#xff0c;编号1~n&#xff0c;有些城市之间有路相连&#xff0c;有些则没有&#xff0c;有路则当然有一个距离。现在规定只能从编号小的城市到编号大的城市&#xff0c;问你从编号为1的城市到编号为n的城市之间的最短距离是多少&#xff1f…

AspNetCoreApi 跨域处理(CORS )

如果咱们有处理过MV5 跨域问题这个问题也不大。&#xff08;1&#xff09;为什么会出现跨域问题&#xff1a;浏览器安全限制了前端脚本跨站点的访问资源&#xff0c;所以在调用WebApi 接口时不能成功访问资源&#xff0c;原因“同源策略”的存在&#xff1a;同源指以下几点相同…

业务配置开发平台qMISPlat 2.0 产品介绍

qMISPlat是什么qMISPlat(业务配置开发平台)是一套基于.net core 2.0、跨平台的&#xff0c;面向开发人员和具有一定技术水平的业务人员使用的业务配置开发平台。基于此平台您只需通过配置和少量开发即可快速搭建满足用户需求的业务系统&#xff0c;大大降低项目开发工作量。平台…

2、异步HTTP编程

1、处理异步结果 在内部&#xff0c;play框架是自下而上异步的。Play以异步、非阻塞方式处理每个请求。应用程序代码应尽量避免阻塞控制器&#xff0c;这种阻塞操作的常见例子有JDBC调用、流式API、HTTP请求和长计算。因此应尽量通过保持控制器异步的方法使得应用进行扩展&…

3、play中的模板引擎

1、模板格式 Play默认的模板引擎是一种基于scala的安全模板引擎&#xff0c;尽管模板引擎使用Scala作为表达式语言&#xff0c;但是非常简单易学。参数类型使用后缀语法指定&#xff08;例如&#xff1a; id&#xff1a;Long&#xff09;&#xff0c;泛型类型是使用[]符号&…

.NET Core调用WCF的最佳实践

现在.NET Core貌似很火&#xff0c;与其他.NET开发者交流不说上几句.NET Core都感觉自己落伍了一样。但是冷静背后我们要也看到.NET Core目前还有太多不足&#xff0c;别的不多说&#xff0c;与自家的服务框架WCF集成起来就不咋地&#xff0c;从最初不支持&#xff0c;到现在有…

4、表单提交和验证

1、启用/禁用表单module sbt启动应用时默认就启用了表单&#xff0c;也可以在build.sbt中添加启用libraryDependencies javaForms&#xff0c;想要移除表单时使用PlayMinimalJava 插件 2、play接收表单数据 play.data中的类可用于处理HTTP表单数据提交和验证&#xff0c;操…

【贪心】最佳浏览路线问题

最佳浏览路线问题最佳浏览路线问题最佳浏览路线问题 题目描述 某旅游区的街道成网格状&#xff08;见图&#xff09;&#xff0c;其中东西向的街道都是旅游街&#xff0c;南北向的街道都是林荫道。由于游客众多&#xff0c;旅游街被规定为单行道。游客在旅游街上只能从西向东…

Ooui:在浏览器中运行.NET应用

在过去数年中&#xff0c;桌面应用开发人员一直处境艰难&#xff0c;因为人们的主要关注点聚焦于Web和移动应用。由于Microsoft未来Windows平台的计划未定&#xff0c;并且UWP应用也没有突破性进展&#xff0c;因此技术落伍的责任也不应由.NET开发人员来承担。当前迫切需要解决…

5、play中的json数据处理

1、play中的json库 Play使用Jackson JSON库将对象转换为JSON和JSON之间的对象。play的操作使用JsonNode类型&#xff0c;play.libs.json包中有操作json数据的方法 2、java对象和json数据 将java对象转成play中的JsonNode类型&#xff1a; 将JsonNode格式的数据解析到java对象…

农行基于TFS工具的敏捷转型实践

““春天工程”项目组是应用开发二部最早采用敏捷模式的项目组&#xff0c;项目组在项目推进过程中使用Scrum框架&#xff0c;结合“看板站会”形式&#xff0c;积极探索项目推进新措施。结合TFS工具逐步实现了电子工具与物理看板的有机融合&#xff0c;并在过程管理、版本管理…

6、XML数据处理

1、处理xml请求 两种方式&#xff0c;一是直接将请求体数据转成Document对象&#xff1a; 二是定义自己的解析格式将请求体进行解析&#xff1a; 2、返回xml格式数据响应 设置响应头格式为application/xml类型

.NET Core:新的快速开发平台

.NET Core 今年已经发布了 2.0 版本了。技术雷达最近将 .NET Core 从“评估”移到了“试用”阶段&#xff0c;意味着运用这项技术的风险在不断减小。本文将简要介绍基于 .NET Core 的快速开发的方式。.NET Core 产生于 2014年&#xff0c;是一个不折不扣的新开发平台。SmallTal…

7、play中的文件上传

1、基本的文件上传处理 将form的类型设置成multipart/form-data&#xff0c;请求的方式必须是POST类型&#xff0c;实例如下&#xff1a; 请求发到controller&#xff0c;controller中处理&#xff1a; public Result upload() {MultipartFormData<TemporaryFile> bod…