使用非公开辅助类HttpValueCollection轻松生成QueryString

作者:V君 发布于:2016-11-7 18:19 Monday 分类:挖坑经验

TL;DR

var kvp = HttpUtility.ParseQueryString("");

kvp["a"]="bc"; 

kvp["b"]="cd"; 

kvp["c"]="草";

var queryString=kvp.ToString(); //queryString结果为"a=bc&b=cd&c=%u8349"


注意:由于ToString会自动把内容做Url编码,某些服务接口需要计算数字签名可能会遇到问题,

这种情况还是只能自己拼字符串... 比如某德的接口


听我扯扯:

在做服务端调用远程Web接口时需要组装QueryString请求参数,

依稀记得在Web项目里用的QueryString是个NameValueCollection, 并能ToString还原

然而自己创建实例丢值进去却没得到理想的结果,

咕狗到爆栈得到答案:原来Web项目里的是M$重写过的内部类:HttpValueCollection

反编译发现确实如此, 然而要怎么用呢, 首先想到是反射再实例化,

这种做法略Hack,指不出哪天或哪个平台就来个空指针给你.

继续咕狗爆栈, 得出这么贱的用法, 塞他个空字符串让它吐出实例, 太棒了!

快来解决问题的帖子一起点赞吧!

标签: 软件开发 C# Web技术

评论(0) 引用(0) 浏览(178)

使用Debug Diagnostic Tool分析.net转储

作者:V君 发布于:2016-10-25 11:26 Tuesday 分类:挖坑经验

TL;DR:

去M¥官网下载该工具, 对应其x86/x64. 安装时选择关联文件类型. 

装好之后双击要分析的dmp文件. 等一会儿. 一个可视化的mht分析报表就出来了.

注意这工具只能在Vista(NT6)以上环境运行.


转储dmp文件可以用Sysinternals出品的免费系统工具Process Explorer来做.


听我扯扯:

虽然WinDbg+sos/sosex很强大, 但是用起来很复杂, 载入符号也很慢.

于是找到了这货来帮忙, 尽管和前者比起来就差不能在内存中找对象.

但是非常方便收集异常信息以及线程堆栈.

标签: 软件开发 C# 调试技术 windbg

评论(0) 引用(0) 浏览(173)

解决ASP.NET Boilerplate与EntityFramework反复出现无用更新的现象[Update]

作者:V君 发布于:2016-10-23 15:49 Sunday 分类:挖坑经验

TL;DR

重写SaveChanges和SaveChangesAsync ,

在base实现调用之前增加以下代码,去除对前三个字段的无用更新的操作.

private static readonly HashSet<string> IgnoreCheckUpdateFields = new HashSet<string>

{

    nameof(IAudited.CreationTime),

    nameof(IAudited.LastModificationTime),

    nameof(IAudited.LastModifierUserId),

    nameof(Entity.Id),

};


private void BlockNeedLessUpdate()

{

    //LEVEL 1: always CreationTime

    var allModified = ChangeTracker

        .Entries<ICreationAudited>()

        .Where(p => p.State == EntityState.Modified);


    foreach (var item in allModified)

        item.Property(nameof(ICreationAudited.CreationTime))

            .IsModified = false;


    //LEVEL 2: only LastModificationTime LastModifierUserId

    var allModified2 = ChangeTracker

        .Entries<IAudited>()

        .Where(p => p.State == EntityState.Modified);


    foreach (var item in allModified2)

    {

        var changed = item.CurrentValues.PropertyNames

         .Any(p => !IgnoreCheckUpdateFields.Contains(p) 

         && false == item.CurrentValues[p]?.Equals(item.OriginalValues[p]));


        if (changed) continue;

        item.Property(nameof(IAudited.LastModificationTime)).IsModified = false;

        item.Property(nameof(IAudited.LastModifierUserId)).IsModified = false;

    }

}

 

听我扯扯:

由于ASP.NET Boilerplate首次启动/登录时很慢, 于是将EF生成的SQL语句打到调试输出.

发现大量的创建时间被更新的现象. 

深入调查发现可能是因为 CreationAuditedEntity 在构造时初始化成 Clock.Now

然后EF从数据库读出值再次绑定,

造成 CreationTime 的 setter 被多次调用导致变更追踪机制懵逼.

粗暴地把所有对 CreationTime 的更新操作屏蔽就好了.

不知道是不是错觉, 这么做了之后发现调试启动速度快了70%呀.


ps. 或许 EF 的变更追踪没有 dbml 那么完善,它只监视赋值行为.然而 dbml 还检查了值变化.


Update:

随着继续调试又发现Tenant的LastModificationTime和LastModifierUserId被更新

然而并没更新到别的字段, 明显这样的更新动作是无用的.

进一步调试看起来EF只是简单的比较了两个装了箱的值, 然而在SQL层面又做了值重复过滤

导致这种尴尬现象.

标签: 软件开发 C# 数据库

评论(0) 引用(0) 浏览(191)

解决ASP.NET Boilerplate连接MS SQL报Filter name MustHaveTenant not found

作者:V君 发布于:2016-10-23 15:20 Sunday 分类:挖坑经验

TL;DR

重写 OnModelCreating 要调用base实现. 加上调用base实现需要重建数据库.

 

 

听我扯扯:

受够MySQL提供程序的bug之后, 换MS SQL看看会不会好点.

直接在 DbContext 和迁移剔除所有 MySQL 的 Attribute

再去Web.Config把所有My配置去掉.连接字符串改到MS SQL.

 

编译然后生成数据库报错了. 提示 ON DELETE NO ACTION

咕狗到爆栈帖子说是实体关系配置问题. 重写了 OnModelCreating 方法.

 

然后, 尽管数据库生成出来了.

然而运行起来就爆炸鸟:Filter name MustHaveTenant not found....

 

各种问, 各种咕狗. 然后找到了ABP作者的回帖最终完美解决问题, 顺利地跑起来!

接下来看看EF-LINQ提供程序做复杂投影有没有MySQL的问题吧!

标签: 软件开发 C# 数据库

评论(0) 引用(0) 浏览(212)

[成功]搭建咕狗镜像

作者:V君 发布于:2016-9-17 23:12 Saturday 分类:折腾手记

尽管前段时间做的的半自动扶梯可以让咱在有环境的PC上尽情的咕狗, 

然而在外面用便携设备上咕狗还是很困难

 -- 找到的一个个镜像相继挂掉, 新的越来越少...

是时候自己搭一个了.


参考算法组上sys发表的文章 一键搭建谷歌镜像站 
文章写得很详细, 不过对于没接触过nginx的新手(比如咱)就有点摸不着头脑

像配置文件在哪儿, 配置节点丢哪这种问题

所以才会有这篇文章写下更详细的步骤.


原文命令步骤就不照搬了, 这次只讲讲咱的经历.

首先尝试了最简安装, 失败了, 估计是主机提供商已经安装有软件包还自己编译, 搞糊了...


重新初始化主机实例后尝试从发行版迁移, 成功了!


安装软件包和获取源码后的解压缩命令并没有包含在原文

tar xzvf nginx-1.4.7.tar.gz

进去配置然后编译吧, cd nginx-1.4.7/ 

configure参数按照 nginx -V 吐出的内容外加文章中的最后两行, 增加两个额外模块

然后执行一下文中没点到的 make继续往下走, 直到服务启动OK


接着更改配置文件, 和apache类似, 在 /etc/nginx/nginx.conf 

找到 http { 节点,在对应的 } 前面加上文章中的server配置内容, 注意你的域名以及端口.

保存后重启服务就可以吃辣!


可能是主机提供商的环境有点怪, 常规的 update-rc.d 不起作用.

只好在 /etc/profile 最后加上一行 sudo service nginx start 就这样歪着实现自启动啦!


~EOF

标签: linux 新手指引 nginx

评论(0) 引用(0) 浏览(211)

Powered by emlog 去你妹的备案 sitemap