C#中const与readonly区别

近期将旺财代码生成器的Entity代码进行优化,表名和字段名

一句话:const的值是固定的,代码里面写死的,每一次编译后结果都一样,而readonly的值是可以在运行的时候才确定值的。

了解更多:所谓静态常量就是在编译期间会对变量进行解析,再将常量的值替换成初始化的值;所谓动态常量就是编译期间会将变量标记只读常量,而不用常量的值代替,这样在声明时可以不初始化,可以延迟到构造函数初始化。

有关内存:const修饰的常量没有内存消耗;readonly因为需要保存常量,所以有内存消耗。

Xamarin.Forms扩平台移动开发初体验

近期花了1周时间熟悉和使用Xamarin.Forms进行跨平台开发,本想做一个针对H5 Web的封装,希望在安卓和苹果平台优先使用微信X5内核的浏览器,然后最差也要用Chrome内核的,可惜百度、Google翻墙,QQ群咨询,试了WebView的CustomRender,也尝试了Xamarin.Forms.Essential 的Browser,以失败告终。

不过通过这个实例从零开始研究,倒是发现很多亮点:

1、使用VS2017直接在线安装Xamarin.Forms所必需的开发环境、JDK、安卓模拟器等,无比流畅
2、使用Xamarin.Forms开发同时兼容多个移动平台,这个概念的确很棒,新手上手挺快
3、Xamarin.Forms官方的在线文档和基础视频还算齐备,有一定英文基础的,应该很容易入门。
4、国内的Xamarin.Forms相关QQ群有超过20个活跃的,大群有1000多人,还出现了收费QQ群。
5、国内有人专门制作Xamarin.Forms及相关的培训教材,并在淘宝和QQ群销售,售价也不菲。

ZUI(BootStrap)动态插入HTMl所创建的data-toggle事件初始化方法

这个问题去年碰到过一次,当时没空研究,就跳过去了,换了个方法刷新整个页面。不用你说,我现在也觉得有点傻(当时也觉得)。

这次又碰到类似的,用ZUI(基于BootStrap)的lightbox,动态HTML增加了图片,但是data-toggle=”lightbox”这个事件不生效,点击一下图片直接当前窗口打开图片链接了。其实所有的data-toggle都有一样的问题,就是不生效。

有些人说需要Append相应的HTML后,动态的data-toggle属性设置一下,其实是没用的。

还有人说用全局的delegate,那个小题大做。如果自己写的自定义函数,倒是可以用。

其实很简单,就是Append之后,获取到DOM的元素后,手动激活一下事件。

$(“.cards”).find(‘.card’).eq(0).find(‘a’).eq(0).lightbox();

popover同理:$(“.cards”).find(‘.card’).eq(0).find(‘a’).eq(0).popover();

还在用Windows 2003服务器的朋友注意啦

如果你仍有旧的应用在Windows 2003上,对于SSL这已经是一个淘汰的操作系统了。它不支持TLS 1.1和1.2,更不要说TLS 1.3了,在SSL成为网站标配的今天,请务必升级操作系统。

SSL Protocol: These are the following list of protocols which have been released till date:

  1. SSL 1.0, 2.0 and 3.0
  2. TLS 1.0 (or SSL 3.1, released in 1999)
  3. TLS 1.1 (or SSL 3.2, released in 2006)
  4. TLS 1.2 (or SSL 3.3, released in 2008)
    NOTE: Windows Server 2008 R2 and Windows 7 are the only 2 OS which support TLS 1.1 and TLS 1.2 in 2008. All the OS’s before this don’t support these 2 protocols.

阿里云ECS邮件发送失败原因

首先这不是个技术问题,是没仔细阅读阿里云的产品帮助。

问题的现象:调用阿里云的邮件推送服务,本地程序没有任何问题,发布到阿里云的服务器,邮件发不出去了。

花了点时间看帮助,才知道目前阿里云的ECS服务器均已默认关闭了25端口,如果您的发送程序部署在阿里云 ECS 上,不勾选 SSL 时,使用 80 端口;勾选 SSL 时,使用 465 端口。

阿里云的邮件推送在线帮助:https://help.aliyun.com/document_detail/29449.html

旺财C# .NET代码生成器支持DTcms MySQL版生成了

昨天跟一资深老用户沟通之后,发现DTcms MySql版用得人越来越多了,整个运行于Linux主机下,比一定要Windows和MSSQL数据库的要求降低了很多,优势太明显。

于是昨晚加班,国庆假期前,搞定如下升级:

1、完成MySql.Data.dll更新

消除了报错:MySql.Data.MySqlClient.MySqlException:Fatal error encountered attempting to read the resultset,以便支持较新版本的MySql数据库。

2、完善读取MySql数据库的表列表和字段属性的脚本

SELECT table_name TableName,TABLE_COMMENT TableDescription
FROM INFORMATION_SCHEMA.TABLES WHERE table_type = ‘base table’
ORDER BY table_name

SELECT CASE ORDINAL_POSITION WHEN 1 THEN TABLE_NAME ELSE ” END TableName,
ORDINAL_POSITION 序,COLUMN_NAME ColumnName,
CASE EXTRA WHEN ‘AUTO_INCREMENT’ THEN ‘Y’ ELSE ” END IsIdentity,
case COLUMN_Key when ‘PRI’ then ‘Y’ else ” END PrimaryKey,
DATA_TYPE DataType,
CASE DATA_TYPE
WHEN ‘double’ THEN NUMERIC_PRECISION
WHEN ‘decimal’ THEN NUMERIC_PRECISION
WHEN ‘tinyint’ THEN NUMERIC_PRECISION
WHEN ‘int’ THEN NUMERIC_PRECISION
WHEN ‘bigint’ THEN NUMERIC_PRECISION
ELSE CASE WHEN CHARACTER_MAXIMUM_LENGTH IS NULL THEN 0 ELSE CHARACTER_MAXIMUM_LENGTH END
END ByteLength,
CASE DATA_TYPE
WHEN ‘double’ THEN NUMERIC_PRECISION
WHEN ‘decimal’ THEN NUMERIC_PRECISION
WHEN ‘tinyint’ THEN NUMERIC_PRECISION
WHEN ‘int’ THEN NUMERIC_PRECISION
WHEN ‘bigint’ THEN NUMERIC_PRECISION
ELSE CASE WHEN CHARACTER_MAXIMUM_LENGTH IS NULL THEN 0 ELSE CHARACTER_MAXIMUM_LENGTH END
END Length,
IFNULL(numeric_scale,”) IsNumeric,
CASE is_nullable WHEN ‘YES’ THEN ‘Y’ ELSE ” END AllowNull,
column_default DefaultValue,
COLUMN_COMMENT Description
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ‘tableName ‘

3、增加DTcms4/5 MySql版DAL生成

生成到新目录:DTcms.DAL.MySql,2个模板,同时支持DTcms4和DTcms5两个版本。

4、发布V20181001国庆版

5、下一步计划整理在线版的帮助文档

图文和视频汇总在一起,并增加开发实例视频教程

C# .Net中获取Windows AD域用户缺失的故障解决

因为公司的OA系统使用的Windows域账号集成认证,近期新来的同事账号却没能自动导入账号到OA系统,花了快一天时间发现并解决了问题。

Windows AD域用户清单获取不全,原来这里的写法有问题:ds.Filter = “(objectClass=user)”改为ds.Filter = “(&(objectClass=user))”

尽管问题很简单,但因此收获了一篇很全面的关于在C#中访问活动域的技术文章,原文地址:Howto: (Almost) Everything In Active Directory via C#

好文分享:ASP.NET WebForm设计思路的思考

博客园的荆棘人写了篇关于WebForm的文字,要知道这么古老的技术已经很好有人提及:https://www.cnblogs.com/Tpf386/p/9588243.html

更可怕的消息是,对于我这样的ASP时代的高手,肯定没有错过WebForm。是的我一直在用,不过更多的是用html+js+ashx+WebForm,只是轻量的用到WebForm的一些控件如:GridView和Repeater。

当然了,我们都要往前走,跳过MVC 3、4、5,直接玩.NET Core MVC是更好的选择。

 

用HttpContext.Current.Cache还是HttpRuntime.Cache

今天不说.NET Core里的新MemoryCache(Microsoft.Extensions.Caching.Memory),说说目前用得最广泛的.NET Framework下的缓存。

  1. HttpRuntime.Cache在非Web环境也支持,如WinForm、WPF
  2. HttpContext.Current.Cache只能用在Web中

MSDN上的解释如下:
HttpContext.Current.Cache:为当前 HTTP 请求获取Cache对象。
HttpRuntime.Cache:获取当前应用程序的Cache对象。
为一探究竟,我们用.NET Reflector看看HttpContext.Cache和HttpRuntime.Cache的源码:

//System.Web.HttpContext.Cache属性实现
public sealed class HttpContext
{
public Cache Cache
{
get
{
return HttpRuntime.Cache;
}
}
}

//System.Web.HttpRuntime.Cache属性实现
public sealed class HttpRuntime
{
public static Cache Cache
{
get
{
if (AspInstallDirectoryInternal == null)
{
throw new HttpException(SR.GetString(“Aspnet_not_installed”, new object[] { VersionInfo.SystemWebVersion }));
}
Cache cache = _theRuntime._cachePublic;
if (cache == null)
{
CacheInternal cacheInternal = CacheInternal;
CacheSection cacheSection = RuntimeConfig.GetAppConfig().Cache;
cacheInternal.ReadCacheInternalConfig(cacheSection);
_theRuntime._cachePublic = cacheInternal.CachePublic;
cache = _theRuntime._cachePublic;
}
return cache;
}
}
}

通过源码我们可以看出:HttpContext.Current.Cache是通过调用HttpRuntime.Cache实现的。

那么两者到底有没有区别的?既然两个指向的是同一Cache对象,两者的差别只能出现在HttpContext和HttpRuntime上了。

我们再来看看MSDN对HttpContext和HttpRuntime的定义:
HttpContext:封装有关个别HTTP请求的所有HTTP特定的信息,HttpContext.Current为当前的HTTP请求获取HttpContext对象。
HttpRuntime:为当前应用程序提供一组ASP.NET运行时服务。

通过上面的定义可以看出:HttpRuntime.Cache相当于就是一个缓存具体实现类,这个类虽然被放在了System.Web命名空间下,但是非Web应用下也是可以使用。HttpContext.Current.Cache是对上述缓存类的封装,由于封装到了HttpContext类中,局限于只能在知道HttpContext下使用,即只能用于Web应用