AspNet Core IIS部署 HTTP 错误 500.19 – Internal Server Error

环境:

Windows Server 2016 DC

IIS 10

netcore 2.2

错误产生过程(推测可能性):

1,项目文件夹从别的地方复制而来

2,NetCore Hosting 重新安装过

3,netcore项目的IIS程序池重建过

4,以上混合

导致的结果:IIS丢失对项目web.config的读取权限

解决办法:为web.config添加【IIS AppPool\netcore程序池名称】账户可读取权限。账户【IIS AppPool\netcore程序池名称】是新建iis池时自动创建的,不能像windows系统账号一样搜索得到。

参考地址:HTTP Error 500.19 – Internal Server Error when publishing ASP.Net Core Web API to IIS Server

其他可能的情况解决办法参考:关于 IIS 上运行 ASP.NET Core 站点的“HTTP 错误 500.19”错误

携程Apollo安装 笔记

Apllo:GitHub上官网地址

安装过程参考:Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触

过程:

0,下载并安装Git Bash,保持 最新版:Apllo要求使用Git Bash。

1,下载并安装Java 1.8+ (jdk)。就是Java官网的:Java SE Development Kit

2,下载并安装Mysql 5.6.5+

3,下载Apollo项目

4,修改Apllo项目下demo.sh,修改连接mysql的账号密码(两处,一个是db一个是config)

5,git bash切换到Apllo项目目录下,执行 :./demo.sh start

6,等待出现以下讯息表示安装成功

 

采坑记录:

1,之前装过mysql,但是root密码忘记了,参考此链接重置ok。百度的结果真是千篇一律每一个能用的。

a),重置root密码坑:mysql有密码策略,不能太简单,否则重置后无效。密码尽量包含大小写和符号

b),注意密码不要有&符号,否则Apollo的 demo.sh start 会异常。

2,mysql默认max_connections是20, demo.sh start 时总是会报 Config service failed to start in 120 seconds! Please check ./service/apollo-service.log for more information.,查看日志显示连接mysql:too many connections

a),登录Mysql执行set GLOBAL max_connections=2000;设置最大连接数。MySQL参数最大连接数max_connections

b),测试在mysql的my.ini中添加 max_connections没有效果。my.ini 要求是ANSI编码,编码不对的话 net start mysql 直接报错 error: Found option without preceding group in config file

3,系统出错,请重试或联系系统负责人,官方说明:点击SampleApp进入配置界面,如果报这错误,请稍后几秒钟重试一下,因为通过Eureka注册的服务有一个刷新的延时。

a),如果是本机测试用的:./demo.sh start 后一定不要更改网络环境!比如如果用的是wifi,start前用的是 信号1,之后切换到了 信号2,再访问8070的项目配置时就会报这个错误。检查方法是:./demo.sh start 看请求的8080端口前的ip是否是你当前ip或localhost,默认是localhost。

b),如果你用了虚拟机、docker或云服务器,在前面 过程4 中应修改 8080端口对应 的ip

SAP .Net 调用RFC通用方法

C# SAP .Net Connector 3.0連接RFC示例

必备环境:

1,类库sapnco.dll、sapnco_utils.dll。可以通过官方下载安装取得,也可以直接从网上只下载这两个类库,还能直接从NuGet获取:Install-Package SAPDotNetConnector3 -Version 0.3.0

2,Microsoft Visual C++ 2010 Redistributable Package,简称Microsoft Visual C++ 2010 。下载链接,可从控制面板查看已安装程序确认有没安装。Windows更新中可能已包含了Microsoft Visual C++ 2010,但不在已安装程序中显示。

步骤1:SAP定义RFC

步骤2:C#实现

a):调用SAP RFC封装类:

b):RFC返回Table转.Net平台DataTable对象。

c):C#通过封装类库调用RFC

 

selet2 vue2实现下拉级联


 

 

功能:起运港 与 目的港 来源于一张表,两个栏位为多对多关系,即1个起运港可以对应多个目的港,1个目的港也可以对应多个起运港。两个栏位下拉选项互为限制条件。

难点:select2组件change事件要能与父级(即Vue)通信,并更新 起运港/目的港 拉下选项。vue不允许子组件更新父组价传入的对象,即只允许数据单向流入(要用$emit。测试可传v-model的input的value,传递其他父级传入的对象提示不允许重写父级变量)。

方案:vue通过v-mode将选中的值传入select组件的props对象中,select中监听input change事件,将选中的值通过$emit传回父组件,在父级别(即vue)监听(watch)选中的值,如果有变更,就去更新对方的下拉选项访问(例如:监听起运港,如果选了1,就去更新目的港绑定的下拉选项)

实现:

slect2组件定义:

html中使用select2组件:

 

vue实现:

 

 

Nginx Docker方式部署ASP.NET Core项目

前述:

凡是基于http请求的的项目,都需要有有一个server以提供对client(UserAgent)的请求做处理并相应。也就是要有个HttpServer,也就是web服务器。(此处的web服务器是指提供处理http请求软件,非实体主机。web主机亦称作web服务器,此处服务器只实体主机。不要混淆)

web服务器:在Windows平台通常都是以IIS作为担当,在Linux上则通常是Nginx、Apache、TomCat。

ASP.Net Core项目:asp.net core 内部使用的是Kestrel作为web服务器,本地项目调试没有任何问题,但部署到Web服务器上,是无法直接被外部网络访问的,因为如果没有对Kestrel配置就不提供对外部访问的支持(待查证)。

部署:

Windows IIS上部署:参考官网步骤 使用 IIS 在 Windows 上托管 ASP.NET Core ,关键步骤就是 安装 .NET Core 托管捆绑包,按步骤,下载并安装项目引用的netcore版本的runtime,并在IIS新建无托管的应用程序池,并为网站或虚拟应用程序绑定此池。

Linux Nginx上部署:参考官网 使用 Nginx 在 Linux 上托管 ASP.NET Core ,关键点:1,必须在Startup.Configure中配置支持反省代理 2,在/etc/nginx/sites-available/default默认为新增server节点,配置反向代理(实际就是讲Nginx监听的外部访问端口映射到 ASP.Net.Core项目的端口:默认5000端口)

 

最后:在Linux上 Nginx Docker方式部署ASP.NET Core项目

参考 如何用一台服务器,部署多个不同的 WEB 项目 (use nginx in docker)

步骤:

1,下载并安装对应的Linux版本netcore运行时

2,安装Docker,官网链接

3,安装Nginx(Docker方式),代替直接在主机上安装Nginx:条件建立好~/nginx-reverse-proxy文件夹,及www conf logs,用于将本机(host)路径与Docker中Nginx html、nginx.conf、log关联,也就是挂载,也就是docker说的卷(Volume),如此如果对其中的文件做了修改 Nginx的Docker容器每次启动都都会加重最新的。

4,步骤3启动的Nginx,Docker中的80端口映射为了Host的80端口,如此,效果就同主机上(Host)安装了Nginx。

5,之后就是修改映射到host上的配置文件修改conf/nginx.conf ,添加反向代理的配置(在Nginx配置文件配置asp.net core项目Kestrel使用的端口map到的主机端口,外部网络就可以通过此端口进行访问了)。

下面的命令 就是将host的100端口映射到另一个Nginx容器的80端口。反向代理配置应将项目Kestrel端口映射为Host的100端口。外部网络通过主机 ip:100或域名的方式就可以访问项目了。

 

 

 

 

WebSocket应用实例–进度条实现

应用背景:


系统新增资料 批量上传 功能,用户再上传过程中,不知道上传进度,等待时间过长会误以为系统导入异常 而关闭页面,重新导入,可能出现资料重复的问题。为此,需要提供类似文件上传进度 将执行进度回复给前端页面的方案。

消息从服务端客户端主动推送到客户端,最直接的方案是使用WebSocke(可以双向通信就行)。感觉是有点大材小用了。

具体实现

a,页面加载时与WebSocket服务端建立连接

b,服务端接收连接请求并记录下客户端socket连接

c,执行导入

d,服务端将进度返回前端(当前记录行/总记录行数)

e,前端解析

 

1,前端:

2,后段实现:

遇到的问题:

在使用Form 对button是submit类型,提交到Action时,页面点击 [执行导入]时,Firefox存在一个问题:载入页面时与 ws: 的连接中断。官方也一直没有解决此问题。Chrome就可以正常执行。

解决办法就是使用Ajax,如此页面URL就不会是等待加载 的状态了,数据也能提交执行,然后通过WebSocket将进度传回前端。

MS SQLServer ISNUMBER()/NOT EXSITS 替换方案、

 

Sqlserver 中文全角符号like查询