树莓派+Win10 iot跑NetCore2网站

前期准备

  1. 一个树莓派刷上最新的Win10 iot 15063系统
  2. 一个NetCore2的网站,能在PC上正常运行就可以了

PS:如何刷Win10 iot系统和如何创建Asp.Net Core网站不在本文的讨论范围,请自行百度

网站发布

运行指令

dotnet publish -c release -r win-arm

然后把红线部分的内容复制到树莓派上

这里可以通过文件共享复制

\\192.168.99.147\c$\

PS:192.168.99.147是我树莓派的ip

然后登录到树莓派的PowerShell(可通过 Iot Dashboard 上的 我的设备 右键 找到)

运行指令,开放防火墙端口

netsh advfirewall firewall add rule name="NetCore2 APP" dir=in action=allow protocol=TCP localport=5001

默认端口是5000,我这里项目中修改成5001

然后运行

cd C:\Web
.\WeChat.exe

WeChat是我的项目名,需要自行替换成自己的

最终效果

VsCode离线配置OmniSharp

环境的安装

第一步你要安装一个vscode

如果网速不给力,可以使用百度云的离线下载,然后再下载到本机安装。

第二步安装.Net Core运行环境和客户端命令

请移步dot.net站点下载.Net Core编译运行环境

第三步安装OmniSharp

在线安装在线安装方法
离线安装vsix文件安装

最后安装OmniSharp智能提示+Debugger

这一步是最慢的因为要联网下载OmniSharp和Debugger,如果网速不好的童鞋请按照如下方式安装:
打开vscode扩展安装目录中的c:\users*.vscode\extensions\ms-vscode.csharp-..\package.json文件找到下图中的url进行下载:* 这个runtimeDependencies节点包涵了所有类型的系统的智能提示Debugger工具,因为我使用的是windows,所以我需要下载了这两个工具:

  1. 智能提示:https://omnisharpdownload.blob.core.windows.net/ext/omnisharp-win-x86-1.9-beta22.zip
    解压到C:\Users**.vscode\extensions\ms-vscode.csharp-..\bin\omnisharp目录中即可
  2. Debugger:https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-win7-x64.zip
    解压到C:\Users**.vscode\extensions\ms-vscode.csharp-...debugger目录中即可
  3. 最后创建C:\Users**.vscode\extensions\ms-vscode.csharp-..\install.LOCK空文本文件即可

LBS位置服务的SQL实现原理以及SQL代码

一、位置服务(搜索周边商家POI)

  1. 自身有海量的周边搜索数据,并且一定要有经纬度坐标;(数��来源可以从网上购买,如果要直接从地图API中获取,那是要付费的,而且费用不菲)
  2. 手机定位后将经纬度发送给服务器,服务器根据经纬度在数据库中匹配数据,并按照距离由近到远排序(此处省略一万字...)

SQL实现经纬度匹配以及距离排序代码

1、SQL计算经纬度距离的自定义函数

CREATE FUNCTION dbo.GetDistance  
(  
    @LatBegin REAL  
    , @LngBegin REAL  
    , @LatEnd REAL  
    , @LngEnd REAL  
)  
RETURNS FLOAT  
AS  
BEGIN  
    DECLARE @Distance REAL  
    DECLARE @EARTH_RADIUS REAL  
    SET @EARTH_RADIUS = 6378.137  
      
    DECLARE @RadLatBegin REAL, @RadLatEnd REAL, @RadLatDiff REAL, @RadLngDiff REAL  
    SET @RadLatBegin = @LatBegin * PI() / 180.0  
    SET @RadLatEnd = @LatEnd * PI() / 180.0  
    SET @RadLatDiff = @RadLatBegin - @RadLatEnd  
    SET @RadLngDiff = @LngBegin * PI() / 180.0 - @LngEnd * PI() / 180.0  
      
    SET @Distance = 2 * ASIN(SQRT(POWER(Sin(@RadLatDiff / 2), 2) + COS(@RadLatBegin) * COS(@RadLatEnd) * POWER(SIN(@RadLngDiff/2),2)))  
    SET @Distance = @Distance * @EARTH_RADIUS  
    --SET @Distance = Round(@Distance * 10000) / 10000  
      
    RETURN @Distance * 1000  
END  

2、获取周边数据的存储过程

CREATE PROCEDURE Up_Data_GetPOI 
	@lngbegin nvarchar(50), --当前经度
	@latbegin nvarchar(50), --当前纬度
	@distance int, --搜索半径,单位为米
	@WhereStr nvarchar(200) --附加搜索条件,如and 1=2 
	AS
	declare @SqlStr nvarchar(2000)
	
	set @SqlStr='select *, dbo.GetDistance('+@latbegin+','+@lngbegin+',纬度字段,经度字段) as distance from [存储商家的数据表名] where (纬度字段<>'' and 经度字段<>'') and dbo.GetDistance('+@latbegin+','+@lngbegin+',纬度字段,经度字段)<'+Convert(nvarchar(10),@distance)+' '+@WhereStr+' order by distance asc'
	
	--print @SqlStr
	Execute Sp_ExecuteSql @SqlStr
GO

二、位置交友

  1. 要有会员数据,同样也得有客户端是否在线以及经纬度的字段(不一定要获取到经纬度,默认为空)
  2. 手机客户端定位后,更新该会员的经纬度坐标以及客户端在线状态
  3. 通过上面的SQL代码即可实现数据列表,只要输出JSON/XML给手机客户端解析即可

.Net Core使用GB2312编码

.Net Core默认是UTF8编码,但有些时候需要使用GB2312编码

Encoding.GetEncoding("GB2312")

但代码运行时候会报错误

No data is available for encoding 936.

这时需要引用Nuget包

System.Text.Encoding.CodePages 4.3.0

再在 Startup 的构造函数中加上一行代码

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

 

Serenity For asp.net core项目发布后运行不正常解决

Serenity For asp.net core项目使用 dotnet publish 指令发布到iis后,使用时候报错

Script data Template.* is not found in registered script list!

解决方法:

修改 project.json 的 publishOptions 配置节 增加 "**/*.html", 项

  "publishOptions": {
			"include": [
				"wwwroot",
				"**/*.cshtml",
				"**/*.html",
				"appsettings.json",
				"web.config"
			]
  },

 

[开源]TFS与微信企业号的通知整合

直接上地址:

https://github.com/lishewen/TFSWebHook

使用方法:

1、修改web.config中的CorpId/Secret/AgentId,为你自己企业号中申请到的key

2、把站点发布到IIS

3、在TFS 服务挂钩 设置中,选择 Web挂钩 ,并填入URL

http://<host>/api/webhooks/incoming/vsts?code=D854DE27C4ED4A10BFC6BE6E21C3A5A1

如果修改了web.config中对应的code这里也要换成自己的

4、我这里只写了签入代码和git push的事件通知,如果需要其他通知 如工作项变更通知,可自行到Webhooks/VstsWebHookHandler.cs 中添加即可

效果图:

.Net Core msbuild配置编译条件

例如,我想只在Debug模式下才运行 npm run less 脚本

这时只需在csproj项目文件中对应的配置节

  <Target Name="PostcompileScript" AfterTargets="Build">
    <Exec Command="npm run less" />
  </Target>

加上判断条件,即可

Condition=" '$(Configuration)' == 'Debug' "

即修改为:

  <Target Name="PostcompileScript" AfterTargets="Build" Condition=" '$(Configuration)' == 'Debug' ">
    <Exec Command="npm run less" />
  </Target>

 

JRE升级导致Elasticsearch故障处理

今天发现Elasticsearch服务故障,重启后还是不行,具体日志如下:

[2017-02-10 10:01:32] [info]  [32412] Commons Daemon procrun (1.0.15.0 64-bit) started
[2017-02-10 10:01:32] [info]  [32412] Running 'elasticsearch-service-x64' Service...
[2017-02-10 10:01:32] [info]  [18112] Starting service...
[2017-02-10 10:01:32] [error] [18112] Failed creating java C:\Program Files\Java\jre1.8.0_111\bin\server\jvm.dll
[2017-02-10 10:01:32] [error] [18112] 系统找不到指定的路径。
[2017-02-10 10:01:32] [error] [18112] ServiceStart returned 1
[2017-02-10 10:01:32] [error] [18112] 系统找不到指定的路径。

原因分析:

去硬盘找了一下的确没有这个文件了,倒是在 C:\Program Files\Java\jre1.8.0_121\bin\server 路径下发现了此文件

应该是Java自动更新后把老版的文件Delete掉导致的

解决办法:

去cmd执行指令

service manager elasticsearch-service-x64

把路径改对即可

Excel VBA 删除自定义样式宏

Sub Del_YS()
'删除自定义样式
For Each s In ActiveWorkbook.Styles
'MsgBox s.Name
On Error Resume Next
If Len(s.Name) > 0 And s.Name <> "Normal" Then
s.Delete
End If
If Err.Number > 0 Then
e = "Error occour on deleting Style named " & s.Name
e = e & vbCrLf & "Err:" & Err.Number & "->" & Err.Description
MsgBox e
Err.Clear
End If
Next
End Sub

 

在ASP.Net Core RC2中使用XUnit单元测试

建立项目

在现有的解决方案中,添加一个.Net Core类库项目

修改project.json

增加xunit相关包的引用

例如:

	"testRunner": "xunit",
	"dependencies": {
		"Microsoft.NETCore.App": {
			"version": "1.0.0-rc2-3002702",
			"type": "platform"
		},
		"xunit": "2.1.0",
		"xunit.runner.visualstudio": "2.1.0",
		"dotnet-test-xunit": "1.0.0-rc2-build10025"
	},

如果你不需要与VS IDE的单元测试集成,则可以删掉 xunit.runner.visualstudio 一行

错误提示xunit不支持netstandard1.5

这时需要把 frameworks 修改为

	"frameworks": {
		"netcoreapp1.0": {
			"imports": [
				"dotnet5.6",
				"dnxcore50",
				"portable-net45+win8"
			]
		}
	},

书写单元测试方法

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

使用cli进行单元测试

dotnet test

其他补充

如果你要测试的项目有使用到 appsettings.json 等配置文件,则需要把该文件复制一份到 UnitTest 项目中,然后修改单元测试类的构造函数

		public UnitTest()
		{
			var builder = new ConfigurationBuilder()
				.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
				.AddEnvironmentVariables();

			Startup.Configuration = builder.Build();
		}

修改后可能还会报找不到 appsettings.json 文件的IO异常,此时则需要修改 project.json 文件,让构建发布时把该文件一起发布

	"publishOptions": {
		"include": [
			"appsettings.json"
		]
	},
	"buildOptions": {
		"copyToOutput": [
			"appsettings.json"
		]
	}

TFS测试集成

新建一个文件 RunDotnetTest.ps1

Set-ExecutionPolicy unrestricted -Scope CurrentUser -Force
dotnet test $PSScriptRoot\微信企业号\src\UnitTest -xml $PSScriptRoot\微信企业号\src\UnitTest\testresults.xml

注意修改为自己项目的路径

参照 升级.Net Core RC2的那些事(四)——TFS2015的CI集成 一文中的方法,把此PowerShell文件添加为生成步骤

然后再添加一个 发布测试结果 的生成步骤

相关设置如下:

保存生成定义后,单击 为生成排队 ,可以看看效果