升级.Net Core RC2的那些事(三)——Entity Framework升级

第三篇是Entity Framework升级

修改project.json

把原来 EntityFramework 的包 换成 Microsoft.EntityFrameworkCore

版本从 7.0.0-rc1-final 改为 1.0.0-rc2-final

对照表如下:

RC1 Package RC2 Equivalent
EntityFramework.MicrosoftSqlServer 7.0.0-rc1-final Microsoft.EntityFrameworkCore.SqlServer 1.0.0-rc2-final
EntityFramework.SQLite 7.0.0-rc1-final Microsoft.EntityFrameworkCore.SQLite 1.0.0-rc2-final
EntityFramework7.Npgsql 3.1.0-rc1-3 NpgSql.EntityFrameworkCore.Postgres <to be advised>
EntityFramework.SqlServerCompact35 7.0.0-rc1-final EntityFrameworkCore.SqlServerCompact35 1.0.0-rc2-final
EntityFramework.SqlServerCompact40 7.0.0-rc1-final EntityFrameworkCore.SqlServerCompact40 1.0.0-rc2-final
EntityFramework.InMemory 7.0.0-rc1-final Microsoft.EntityFrameworkCore.InMemory 1.0.0-rc2-final
EntityFramework.IBMDataServer 7.0.0-beta1 Not yet available for RC2
EntityFramework.Commands 7.0.0-rc1-final Microsoft.EntityFrameworkCore.Tools 1.0.0-preview1-final
EntityFramework.MicrosoftSqlServer.Design 7.0.0-rc1-final Microsoft.EntityFrameworkCore.SqlServer.Design 1.0.0-rc2-final

增加EF cli工具

在 project.json 的 tools 配置节中加入

		"Microsoft.EntityFrameworkCore.Tools": {
			"version": "1.0.0-preview1-final",
			"imports": [
				"portable-net45+win8+dnxcore50",
				"portable-net45+win8"
			]
		}

EF的相关cli命令,由原来的 dnx ef 改为 dotnet ef,具体可以通过 dotnet ef --help 来查看

修改代码中的命名空间

把原来的 Microsoft.Data.Entity 改为 Microsoft.EntityFrameworkCore

这里可以批量查找替换掉

修改Startup.cs

RC2中已经移除了AddEntityFramework()、AddInMemoryDatabase()、AddSqlServer(),所以我们也要在代码中相应的移除掉它们,以我自己的项目中为例子

原来为:

		public void ConfigureServices(IServiceCollection services)
		{
#if DEBUG
			services.AddEntityFramework()
				.AddInMemoryDatabase()
				.AddDbContext<EFContext>(option => {
					option.UseInMemoryDatabase();
				});
#else
			services.AddEntityFramework()
				.AddSqlServer()
				.AddDbContext<EFContext>(option => {
					option.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);
				});
#endif
			services.AddApplicationInsightsTelemetry(Configuration);
			// Add framework services.
			services.AddMvc();
		}

现在则改为:

		public void ConfigureServices(IServiceCollection services)
		{
#if DEBUG
			services.AddDbContext<EFContext>(option =>
			{
				option.UseInMemoryDatabase();
			});
#else
			services.AddDbContext<EFContext>(option =>
			{
				option.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);
			});
#endif
			// Add framework services.
			services.AddMvc();
		}

 

升级.Net Core RC2的那些事(二)——升级ASP.Net Core项目

升级完类库项目,第二篇,我们来升级ASP.Net Core项目

修改global.json与project.json

这里可以参照,升级.Net Core RC2的那些事(一)

这里补充一点就是如果你���得这样修改复杂,你完全可以新建一个项目,把这两个文件拷贝过来,再加上自己引用过的包,也是可以的,看你觉得那种方法更简单点

增加Program入口类

Program.cs:

	public class Program
	{
		public static void Main(string[] args)
		{
			var host = new WebHostBuilder()
				.UseKestrel()
				.UseContentRoot(Directory.GetCurrentDirectory())
				.UseIISIntegration()
				.UseStartup<Startup>()
				.Build();

			host.Run();
		}
	}

并移除Startup.cs中的

		// Entry point for the application.
		public static void Main(string[] args) => WebApplication.Run<Startup>(args);

修改类名和命名空间名

将所有 Microsoft.AspNet.* 的命名空间修改为 Microsoft.AspNetCore.*

参照下表修改对应的类名

旧类 新类
IWebApplicationBuilder IWebHostBuilder
WebApplicationBuilder WebHostBuilder
IWebApplication IWebHost
WebApplication WebHost
WebApplicationOptions WebHostOptions
WebApplicationDefaults WebHostDefaults
WebApplicationService WebHostService
WebApplicationConfiguration WebHostConfiguration

如果你有使用全局环境变量,也请对照下表修改

Old prefix New prefix
ASPNET_WEBROOT ASPNETCORE_WEBROOT
ASPNET_SERVER ASPNETCORE_SERVER
ASPNET_APP ASPNETCORE_APPLICATIONNAME
ASPNET_ENVIRONMENT ASPNETCORE_ENVIRONMENT
ASPNET_DETAILEDERRORS ASPNETCORE_DETAILEDERRORS

修改Logging

如果你有使用日志功能,需要修改下日志等级的配置,具体在 appsettings.json

例如:

  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },

具体请对照下表:

Old Levels New Levels
Critical Critical
Error Error
Warning Warning
Information Information
Verbose Debug
Debug Trace

关于PostAsJsonAsync与ReadAsAsync

如果以前有使用 Microsoft.AspNet.WebApi.Client 的,当然现在也是可以直接引用这个包来实现Web API之间的对接的

但我在实战中发现,也许是因为引用包之间的版本冲突,会有诡异的异常,于是我自己实现了一个Helper也分享给大家

	public static class HttpClientHelper
	{
		public static async Task<T> ReadAsAsync<T>(this HttpContent content)
		{
			return JsonConvert.DeserializeObject<T>(await content.ReadAsStringAsync());
		}

		public static async Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient client, string url, T model)
		{
			SetHeader(client);
			return await client.PostAsync(url, SetContent(model));
		}

		private static StringContent SetContent<T>(T model)
		{
			return new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");
		}

		private static void SetHeader(HttpClient client)
		{
			client.DefaultRequestHeaders.Clear();
			client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
			client.DefaultRequestHeaders.AcceptCharset.Add(new StringWithQualityHeaderValue("utf-8"));
		}

		public static async Task<HttpResponseMessage> PutAsJsonAsync<T>(this HttpClient client, string url, T model)
		{
			SetHeader(client);
			return await client.PutAsync(url, SetContent(model));
		}
	}

关于文件上传保存

以前有.SaveAsAsync,这样便捷的扩展方法保存的,现在没有了(或者说藏到了哪里目前找不到了),于是就需要手写

相关的代码片段:

if (model.picdata != null)
			{
				var extName = ContentDispositionHeaderValue.Parse(model.picdata.ContentDisposition).FileName.Trim('"');
				int i = extName.LastIndexOf('.');
				extName = extName.Substring(i);
				string fileName = Guid.NewGuid() + extName;
				var filePath = _hostingEnvironment.WebRootPath + @"\upload\" + fileName;
				//保存文件
				using (var fileStream = new FileStream(filePath, FileMode.Create))
				{
					var inputStream = model.picdata.OpenReadStream();
					await inputStream.CopyToAsync(fileStream);
				}
				//await model.picdata.SaveAsAsync(filePath);
			}

本人的项目中就这一处需要保存文件的,就不封装了:),你喜欢也可以自己封装下

关于System.Drawing

由于项目中需要使用图片处理(生成二维码),好多大神建议另外建项目调用,但我想做在一个项目中,故有此一段

首先,ASP.Net Core项目是不支持System.Drawing的,如果需要使用,则需要修改成纯 net461 的项目,这里需要修改一下project.json

1、删除 Microsoft.NETCore.App 配置节

		"Microsoft.NETCore.App": {
			"version": "1.0.0-rc2-3002702",
			"type": "platform"
		},

2、修改 frameworks 配置节,只保留 net461 项

	"frameworks": {
		"net461": {
			"frameworkAssemblies": {
				"System.Drawing": "4.0.0.0"
			},
			"dependencies": {
				"ThoughtWorks.QRCode": "1.1.0",
				"Microsoft.NETCore.Platforms": "1.0.1-rc2-24027"
			}
		}
	},

这样修改完成后就可以在项目中使用 System.Drawing 命名空间了

副作用:

这样修改后,项目是不能在CoreCLR上跑的,Windows环境下不会存在问题,Linux下则需要配置Mono环境才可以

关于Session

现在光在 ConfigureServices 方法中加 services.AddSession(); 是不够的,实际使用时会报错

还需要在 Configure 方法中加 app.UseSession();

发布到IIS

通过VS发布

现在你可以像MVC5那样通过 右键菜单的 发布 功能,用Web Deploy来发布到IIS,需要注意的是目前这个工具对中文的支持不是很好,所以不要使用中文的项目名哟

通过cli发布

你也可以通过以下命令获得发布文件

dotnet publish -c release

然后把获得的文件通过FTP等途径上传到服务器

PS:此命令需要在 project.json 的同级目录下运行

IIS配置

IIS绑定的目录应该是最多DLL的那一层,而不是以前RC1的wwwroot

应用程序池中设置 无托管代码 等,这些基本和RC1一致

其他补充

如果你的项目存在Areas,默认是不会发布出去的,此时需修改project.json的publishOptions配置节,例如:

	"publishOptions": {
		"include": [
			"wwwroot",
			"Views",
			"Areas/Admin/Views",
			"appsettings.json",
			"web.config"
		]
	},

 

升级.Net Core RC2的那些事(一)——升级RC1的类库项目

微软终于发布了.Net Code RC2了,作为一个软粉当然是第一时间升级了。《升级.Net Core RC2的那些事》系列文章主要是记录本人升级RC2的相关步骤以及遇到过的坑。

第一篇先写类库项目(Nuget包项目)的升级

升级VS工具

这里只提供一个下载地址:.NET Core Tooling Preview 1 for Visual Studio 2015

本人主要使用VS2015开发,升级Update2后,只要装这一个东西就够了,使用VSCode的朋友,或需要手动配置环境的朋友,可以Google相关的文章,这里不做赘述。

修改global.json

如果你项目中没有这个文件,则可以忽略

{
  "sdk": {
    "version": "1.0.0-rc1-update2"
  }
}

修改为

{
	"sdk": {
		"version": "1.0.0-preview1-002702"
	}
}

修改project.json

增加packOptions

原来 tags、projectUrl、licenseUrl 这3个配置项、现在需要放到一个名叫packOptions的节点下

如:

	"tags": [ "weixin", "wechat", "微信" ],
	"projectUrl": "http://blog.lishewen.com/",
	"licenseUrl": "http://blog.lishewen.com/",

现在需要修改为

	"packOptions": {
		"tags": [ "weixin", "wechat", "微信" ],
		"projectUrl": "http://blog.lishewen.com/",
		"licenseUrl": "http://blog.lishewen.com/"
	},

frameworks节的修改

原 net451 或 dnx451 需要修改为 net461

原 dotnet5.4 需要修改为

		"netstandard1.5": {
			"imports": "dnxcore50"
		}

dependencies节的修改

这里主要是修改引用包的版本号

原 1.0.0-rc1-final 或 1.0.0-rc1-update2 的包,修改为 1.0.0-rc2-final

其他包则需要修改成 -rc2-24027 结尾的对应包

发布

RC2的工具现在只会生成DLL,并不会像RC1那样直接生成Nuget包

目前如果需要Nuget的发布包,只能通过cli命令行获得

打包命令:

dotnet pack -c release

PS:此命令需要在project.json文件的同级目录下运行

修复.NET Framework的简单方式

  毫无疑问,对于所有 Windows 的用户和开发者来说,拥有一套正确运作的 .NET Frameworks 非常重要。在开发过程中,使用它可以让意外重写所需的文件变得更加简单。为了更大程度减少故障排除的时间,Microsoft 提供了 .NET Framework Repair Tool。这个工具可以扫描 Windows 系统中的漏洞以及需要安装的 .NET Framework 的包。

  该程序可以通过命令行或是图形化向导程序执行。当没有人看管的情况下,使用命令行开关就可以让工具正常运行,并让合适的 .NET 包出现在网络共享中(相较于需要连接网络的情况)。还可以选择禁用默认功能:当使用工具执行后将诊断日志文件传送到 Microsoft。

  使用的典型操作需要以下步骤:

  1. 扫描已安装的 .NET Framework 中的已知错误,当发现错误时,向用户提供错误列表。
  2. 采用以下任何一条纠正措施:
    • 确保 Windows 安装服务正常运行
    • 重置系统文件夹上的自主访问控制列表
    • 检验并正确更新注册
  3. 如果采取了步骤 2 中的行为还是没有成功解决问题,用户可以选择对已安装的 .NET Frameworks 全修复。
  4. 可选择发送包含系统日志的 CAB 文件给 Microsoft。

  本文作者尝试在自己的机器上运行了这个程序,操作大约进行了 20 分钟左右。完成之后,在 %TEMP%目录下会留下一个 cab 文件,其中包含目录下 AppData 中的日志文件。cab 文件中还包含 HKCR 和 HKLM 的注册转储文件(HKEY_LOCAL_MACHINE)。

  如果想了解有关于这个程序操作的更多细节,可以关注 The .NET Fundamentals Team 的一篇博文和与它的 KB 文章。最新的 V1.3 版本对 .NET Frameworks4.6.1 及之前的版本全部支持。在 Windows 操作系统上通过 Windows 7 Service Pack 1 和 Windows Server 2008 R2 Service Pack 1 支持它的操作。

让TFS忽略packages文件夹的更改

很多时候我们需要使用 Nuget 进行包管理,这时在我们的解决方案文件夹下便会产生一个名为 package 的文件夹

由于 Nuget 包经常要更新,TFS 会自动把这些包放到 正在挂起的更改 处,这对于强迫症十分不友好(这里面明明不是我写的东西Baring teeth smile

于是,这里提供两种方法让 VS 不监视 签入,package 的更新

1、在 团队资源管理器 –> 正在挂起更改 –> 包含的更改 –> 视图选项 –> 勾上 显示解决方案的更改

2、在解决方案的文件夹下,新建一个文本文件,名为 .tfignore

内容为

\packages

如果需要更复杂的配置,可以参考以下信息修改:

################################################################################
#
# 此文件中与 filespecs 匹配的本地项将不会添加到版本
# 控制中。可签入此文件以便与其他人共享排除内容。
#
# 通配符为 * 和 ?。模式以递归方式匹配,除非
# 该模式使用了 \ 字符作为前缀。
#
# 你可以在模式前面放置路径以使其更加明确。如果添加路径,
# 则在路径部分不允许使用通配符。
#
# 行首的 # 字符指示该行是一条注释。
#
# ! 前缀将使模式无效。在某个项由树中更高级别
# 的 .tfignore 文件或团队项目集合的全局排除列表排除之后,
# 可以使用此前缀来重新包括该项。
#
# / 字符在 Windows 平台上被解释为 \ 字符。
#
# 示例:
#
#  # 排除 Alpha\Beta 及其所有子文件夹中以 .txt 结尾的所有文件。
#  Alpha\Beta\*.txt
#
#  # 仅排除此文件夹中以 .cpp 结尾的所有文件。
#  \*.cpp
#
#  # 排除此文件夹及其所有子文件夹中以 .cpp 结尾的所有文件。
#  *.cpp
#
#  # 如果“Contoso”是文件夹,则排除 Contoso 及其所有子项。
#  # 如果它是文件,则仅排除此文件夹中的“Contoso”。
#  \Contoso
#
#  # 如果 Help.exe 已由更高级别的 .tfignore 文件或团队项目
#  # 集合的全局排除列表排除,则此模式仅在此文件夹
#  # 中重新包括它。
#  !\Help.exe     #
################################################################################

使用TFS2015生成并测试ASP.Net Core项目

在TFS上配置ASP.Net Core所需的DNX环境

这里通过PowerShell实现,在解决方案中增加一个PowerShell脚本,这里名为 Prebuild.ps1

# bootstrap DNVM into this session.
&{$Branch='dev';iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.ps1'))}

# load up the global.json so we can find the DNX version
$globalJson = Get-Content -Path $PSScriptRoot\global.json -Raw -ErrorAction Ignore | ConvertFrom-Json -ErrorAction Ignore

if($globalJson)
{
    $dnxVersion = $globalJson.sdk.version
}
else
{
    Write-Warning "Unable to locate global.json to determine using 'latest'"
    $dnxVersion = "latest"
}

# install DNX
# only installs the default (x86, clr) runtime of the framework.
# If you need additional architectures or runtimes you should add additional calls
# ex: & $env:USERPROFILE\.dnx\bin\dnvm install $dnxVersion -r coreclr
& $env:USERPROFILE\.dnx\bin\dnvm install $dnxVersion -Persistent

 # run DNU restore on all project.json files in the src folder including 2>1 to redirect stderr to stdout for badly behaved tools
Get-ChildItem -Path $PSScriptRoot\分销系统 -Filter project.json -Recurse | ForEach-Object { & dnu restore $_.FullName 2>1 }
Get-ChildItem -Path $PSScriptRoot\MVC6.UnitTest -Filter project.json -Recurse | ForEach-Object { & dnu restore $_.FullName 2>1 }

其中 分销系统 和 MVC6.UnitTest 为我测试的项目,即project.json所在的位置,请自行修改为自己对应的项目

然后登录TFS修改生成定义,添加一个PowerShell的生成步骤,把脚本文件指向 Prebuild.ps1

如果你在TFS上找不到这个文件,请先把这个文件签入TFS

添加XUnit项目

如果你的VS中有XUnit的模板,直接添加就可以了。如果没有,可以先创建一个ASP.Net Core Class Library的项目,然后参照下面的 project.json 内容,来添加xunit package的引用

{
	"version": "1.0.0-*",
	"description": "MVC6.UnitTest Class Library",
	"authors": [ "lishewen" ],
	"tags": [ "" ],
	"projectUrl": "",
	"licenseUrl": "",
	"frameworks": {
		"dnx451": {
			"dependencies": {
				"xunit.runner.visualstudio": "2.1.0"
			}
		},
		"dnxcore50": {
			"dependencies": {
				"Microsoft.CSharp": "4.0.1-beta-23516",
				"System.Collections": "4.0.11-beta-23516",
				"System.Linq": "4.0.1-beta-23516",
				"System.Runtime": "4.0.21-beta-23516",
				"System.Threading": "4.0.11-beta-23516"
			}
		}
	},
	"dependencies": {
		"xunit": "2.1.0-*",
		"xunit.runner.dnx": "2.1.0-*"
	},
	"commands": {
		"test": "xunit.runner.dnx"
	}
}

在单元测试中添加一个简单的测试方法

		[Fact]
		public void PassingTestDnx()
		{
			Assert.Equal(1, 1);
		}

写一个运行xunit单元测试的PowerShell脚本,RunDnxTest.ps1

Set-ExecutionPolicy unrestricted -Scope CurrentUser -Force
dnx -p $PSScriptRoot\MVC6.UnitTest test -xml $PSScriptRoot\MVC6.UnitTest\testresults.xml

最后参照 Prebuild.ps1的步骤,在生成定义中,再加一项PowerShell的生成步骤,并指向脚本 RunDnxTest.ps1

此步骤完成后,我们还需要添加一项 发布测试结果 的步骤,已便将XUint的结果与原来Visual Studio 的单元测试结果合并

具体参照下图配置:

至此,ASP.Net Core的自动生成和测试的配置就完成了,我们可以运行下生成定义来看看测试结果

要恢复写博客了

这个博客好久没更新了,心血来潮想写点博客,顺便把这个BlogEngine.Net升级成为3.3版本

为了感谢关注这个博客朋友的支持,特带来两个福利

1、Nuget 国内的镜像,访问nuget官网慢的同学可以试试我这个

http://nuget.lishewen.com/

还有一个阿里云CDN版本的

http://nugetcdn.lishewen.com/

不过上面只放了我项目常用的包,找不到包的朋友也可以联系我更新上去

2、RStudio网页版

snip_20160504081014

想学R语言,但又苦于不懂配环境的同学可以试试这个,不过资源有限,想用的同学可以联系我索取地址和账号

P2P平台跑路频繁 看准第三方托管

以3月为例,截至3月23日,已经有33家P2P平台出现问题,其中有18家跑路,12家提现困难。

在过去的一年,P2P行业充斥着跑路、提现困难等字眼。有人调侃说,现在记者对P2P跑路都不感冒了,每天跑一家都觉得是正常的。

以3月为例,根据有关部门的数据,截至3月23日,已经有33家P2P平台出现问题,其中有18家跑路,12家提现困难,这些问题平台中,不少是上线不久的新平台。很多人选择P2P是看重其高收益,但随之而来的却是高风险。如何挑选安全的平台?融盈贷和您分享曾经选择平台的技巧,今天教大家的是如何挑选一家有第三方托管的P2P平台。

为何要有资金托管?

我们都知道,P2P是个人对个人的借款,平台只是一个中介,将双方撮合,投融双方互不认识。简单地说,投资人投钱,借款人借钱。

如果没有引进第三方托管,资金先停在平台账户上,再由平台去匹配借款项目,容易形成资金池。而一旦资金流不进来,或者出现集中兑付,平台就很有可能出现问题。

所以银监会下了禁令不得建立资金池,在这种情况下,资金就得有第三方托管。资金托管意味着信息流与资金流的独立,投资人的资金由第三方机构独立监管,平台碰不到,也就不会出现低成本的诈骗,或者妄想瞒天过海的庞氏骗局;也杜绝了平台擅自挪用资金做自融、垫付坏账,从而避免了以新换旧的恶性循环出现。

哪些机构有第三方资金托管资质?

目前真正有第三方资金托管资质的第三方支付机构有:联动优势、汇付天下、宝付、国付宝、双乾支付、易宝支付、银联支付等。

值得注意的是,P2P平台有第三方支付功能,并不代表其资金有第三方托管。事实上,第三方支付渠道在于投资人通过支付公司的支付接口,将资金付给P2P网贷平台(比如支付宝、财付通等),而资金托管是投资人和借款人分别在第三方支付开通自己的托管账户,资金是从投资人的托管账户直接进入到借款人的托管账户,整个过程不经过平台,且投资人能看到自己资金的准确去向,从而杜绝了平台卷款而逃的风险。

如何辨别平台有第三方资金托管?

要想辨别平台是否有第三方资金托管其实很简单,真正有第三方资金托管的平台,在投资者注册时,除了注册网贷平台的账户,在第三方托管平台注册一个账户。例如在融盈贷平台投资时,不仅要在平台注册账户,还要跳转到易宝支付平台开通托管账户,如果你在一个平台投资时,只在平台注册了账户,而第三方托管平台没有开户,那么就可以断定这个平台没有资金第三方托管。另外,如果注册后要求你开通第三方托管,只是简单地收录你的手机号和实名信息,并没有跳转到第三方托管平台自己的网站,这样的平台也没有真正的第三方托管,投资者在投资时一定要看清楚。

PC版战网安全令牌WinAuth部分汉化版下载

AFK一段时间了,听说战网密保卡即将停止使用了,需要更换安卓或苹果的手机版安全令牌,对于没有这两种手机的用户(如:WP)来说,这里有个PC端的战网令牌方案,推荐给大家,而且可以同时开多个将军令哦

QQ截图20150323132106

下载地址:

链接: http://pan.baidu.com/s/1nt0x5gt 密码: jbgs

注:此版本是我基于WinAuth最新版修改过的,为了方便国服的朋友进行了部分汉化,并能正确生成国服用的代码

怕有人说是木马,特地放出修改后的源码,会C#的朋友可以自行验证

https://github.com/lishewen/winauth

需要帮助或者有其他疑问的欢迎留言微笑