分类目录归档:后端

Chrome中from memory cache和from disk cache

Chrome中文件缓存有Memory Cache和Disk Cache两种

顾名思义

  • Memory Cache:放在内存中的缓存

  • Disk Cache:放在硬盘上的缓存

一些规律:

  1. 第一次打开页面的时候,是没有缓存的,直接请求资源

  2. 刷新页面(⌘+R)的时候,会发现有些文件是from memory cache,有些是from disk cache

  3. 关掉浏览器,再打开页面,没有memory cache了

  4. 无痕窗口下,资源都会放在memory cache,关掉窗口缓存就没了,不会留下痕迹

  5. 图片会优先放进memory cache

  6. 小文件会优先放进memory cache

  7. 大文件几乎是disk cache

最后送上一张http缓存的图片

.net rest api 下载文件代码

[HttpGet]
public HttpResponseMessage GetImage()
{
  //文件路径
  var path = HostingEnvironment.MapPath("~/App_Data/5.jpg");
  FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
  Image img = Image.FromStream(fileStream);
  MemoryStream ms = new MemoryStream();
  img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
  HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
  result.Content = new ByteArrayContent(ms.ToArray());
  result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg");
  result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
  {
      FileName = "5.jpg"//文件名
  };
  return result;
}

Add jsonp support for your .net mvc api project

使用Attribute来实现jsonp支持

public class JsonpAttribute : ActionFilterAttribute
{
  private const string CallbackQueryParameter = "callback";
  public override void OnActionExecuted(HttpActionExecutedContext context)
  {
    var callback = string.Empty;
    if (IsJsonp(out callback))
    {
      var jsonBuilder = new StringBuilder(callback);
      jsonBuilder.AppendFormat("({0})", context.Response.Content.ReadAsStringAsync().Result);
      context.Response.Content = new StringContent(jsonBuilder.ToString());
    }
    base.OnActionExecuted(context);
  }
  private bool IsJsonp(out string callback)
  {
    callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];
    return !string.IsNullOrEmpty(callback);
  }
}

然后在你的WebApiConfig里面加上
config.Filters.Add(new JsonpAttribute());
这样你的api既能支持json,又能支持jsonp了。
如果url里有?callback=?,就会返回jsonp格式的数据,如果没有,依然是json

node.js – Difference between app.use and app.get in express.js

http://stackoverflow.com/questions/15601703/difference-between-app-use-and-app-get-in-express-js

app.use() is intended for binding middleware to your application. The path is a “mount” or “prefix” path and limits the middleware to only apply to any paths requested that begin with it. It can even be used to embed another application:

// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();
app.use('/subapp', require('./subapp'));
// ...

By specifying / as a “mount” path, app.use() will respond to any path that starts with /, which are all of them and regardless of HTTP verb used:
GET /
PUT /foo
POST /foo/bar
etc.
app.get(), on the other hand, is part of Express’ application routing and is intended for matching and handling a specific route when requested with the GET HTTP verb:
GET /
And, the equivalent routing for your example of app.use() would actually be:

app.all(/^/.*/, function (req, res) {
    res.send('Hello');
});

Node.js 连接 mongodb 教程

新建一个文件夹存放我们的js文件
1.package.json
使用mongodb

{
  "name": "test",
  "version": "0.0.1",
  "private": true,
  "scripts": {
  "start": "node app.js"
  },
  "dependencies": {
  "mongodb":"1.4.7"
  }
}

2.创建文件mongo.js

var MongoClient = require('mongodb').MongoClient;
var db;
var connected = false;
module.exports = {
  connect: function(url, callback){
  MongoClient.connect(url, function(err, _db){
    if (err) { throw new Error('Could not connect: '+err); }
    db = _db;
    connected = true;
    callback(db);
    });
  },
  collection: function(name){
    if (!connected) {
    throw new Error('Must connect to Mongo before calling "collection"');
    }
    return db.collection(name);
  }
};

3.创建app.js

var mongo = require('./mongo');
var mongoUrl = "mongodb://localhost:27017/test";
mongo.connect(mongoUrl, function(){
console.log('Connected to mongo at: ' + mongoUrl);
var coll = mongo.collection('users');
var userObject = {
  username: "admin",
  password: "admin"
};
// create the new user
coll.insert(userObject, function(err,user){
  console.log("created user");
});
coll.find().toArray(function(err, results) {
  console.dir(results);
  });
});

 
源码下载:https://github.com/shengoo/mongotest
效果如下:
mongodb test
 

iis 7 – IIS7 URL Rewrite – Add "www" prefix

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <!--<rule name="Add www" patternSyntax="Wildcard" stopProcessing="true">
          <match url="*" />
        <conditions>
        <add input="{HTTP_HOST}" pattern="test.com" />
          </conditions>
        <action type="Redirect" url="http://www.test.com/{R:0}" />
        </rule>-->
        <rule name="Add www" patternSyntax="ECMAScript" stopProcessing="true">
      <match url=".*" />
        <conditions>
          <add input="{HTTP_HOST}" pattern="^test.com$" />
        </conditions>
        <action type="Redirect" url="http://www.test.com/{R:0}" />
    </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

DataTableSerializer datatable序列化成对象 datatable to entity serialization

public class DataTableSerializer
{
  public static List ToList(DataTable dt)
  {
    var list = new List();
    if (dt == null || dt.Rows.Count == 0)
      return list;//return empty list instead of null object
    list.AddRange(from DataRow row in dt.Rows select ToEntity(row));
    return list;
  }
  public static T ToEntity( DataRow row)
  {
    var objType = typeof(T);
    var obj = Activator.CreateInstance();
    foreach (DataColumn column in row.Table.Columns)
    {
      var property = objType.GetProperty(column.ColumnName,
          BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
      if (property == null || !property.CanWrite)
      {
        continue;
      }
      var value = row[column.ColumnName];
      if (value == DBNull.Value)
      {
        value = null;
      }
      else
      {
        //add what you need.
        //if (column.DataType == typeof (DateTime))
        //{
        //    value = ((DateTime)value).ToString("yyyy-MM-dd");
        //}
      }
      property.SetValue(obj, value, null);
    }
    return obj;
  }
}

npm设置代理

无密码的:

$ npm config set proxy http://server:port
$ npm config set https-proxy http://server:port

有密码的

$ npm config set proxy http://username:password@server:port
$ npm config set https-proxy http://username:pawword@server:port

删除代理

npm config rm proxy
npm config rm https-proxy

用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力。曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用。今天我尝试用简单的方法叙述一下,让大家在五分钟内看完这篇博客。

第一分钟:委托

  有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件。先上一段代码:

下边的代码,完成了一个委托应用的演示。一个委托分三个步骤:

public partial class WebForm3 : System.Web.UI.Page
{
    //step01:首先用delegate定义一个委托 。
    public delegate int CalculatorAdd(int x, int y);
    protected void Page_Load(object sender, EventArgs e)
    {
        //step03:用这个方法来实例化这个委托。
        CalculatorAdd cAdd = new CalculatorAdd(Add);
        //int result = cAdd(5, 6);
        int result = cAdd.Invoke(5,6);
    }
    // step02:声明一个方法来对应委托。
    public int Add(int x, int y)
    {
        return x + y;
    }
}

step01:首先用delegate定义一个委托?。

step02:声明一个方法来对应委托。

step03:用这个方法来实例化这个委托。

至此,一个委托的应该就完成了,就可以调用委托了。

第二分钟:匿名方法

  在上一分钟已经知道了,完成一个委托应用分三步走,缺一步都不行,如果要跨大步,当心步子大了扯着蛋。但是微软不怕扯着蛋,非要把三步做成两步来走啊!所以微软就用匿名方法来简化上边的三个步骤。匿名方法这个玩意儿怎么说呢,在C#中完全是可有可无的东西,只是为C#锦上添花,有人别出心裁给它取个名字叫语法糖。

public partial class WebForm3 : System.Web.UI.Page
{
    //step01:首先用delegate定义一个委托
    public delegate int CalculatorAdd(int x, int y);
    protected void Page_Load(object sender, EventArgs e)
    {
        //step02:用这样的写法 delegate(int x, int y) { return x + y; },把一个方法赋值给委托
        CalculatorAdd cAdd = delegate(int x, int y) { return x + y; };
        int result = cAdd.Invoke(5, 6);
    }
}

step01:首先用delegate定义一个委托 。

step02:用这样的写法 delegate(int x, int y) { return x + y; },把一个方法赋值给委托,其实这种写法就是匿名方法。

这时会惊奇的发现,这不是三步当着两步走了哇?

第三分钟:Lambda表达式

  原本很简单的程序,加上几个delegate关键字,这代码一下就变得深奥了,深奥的东西懂的人就变少了,所以这个还可以作为加薪的筹码。但是微软对C#的设计理念是简单易用。微软就想方设法的来简化delegate(int x, int y) { return x + y; }这个匿名方法,Lambda就出现了。下边我来看几种lambda表达式的写法:

public partial class WebForm3 : System.Web.UI.Page
{
    public delegate int CalculatorAdd(int x, int y);
    protected void Page_Load(object sender, EventArgs e)
    {
        //方法一:
        CalculatorAdd cAdd1 = (int x, int y) => { return x + y; };
        int result1 = cAdd1(5, 6);
        //方法二:
        CalculatorAdd cAdd2 = (x, y) => { return x + y; };
        int result2 = cAdd2(5, 6);
        //方法三:
        CalculatorAdd cAdd3 = (x, y) => x + y;
        int result3 = cAdd2(5, 6);
    }
}

方法一:简单的把delegate去掉,在()与{}之间加上? “=>”。

方法二:在方法一的基础上把参数类型都干掉了。

方法三:要干就干彻底些,把{},以及return关键字都去掉了。

这几种方法随便怎么写都行,不过就是害苦了初学者,一会儿看到这种写法,一会儿看到那种写法,把人搞的神魂颠倒人,如果没人指点,确实会迷糊,难就难在这儿。

第四分钟:泛型委托

  随着.net版本的不升级,新版本总要区别于旧版本吧,不然微软的工程师怎么向他们的老大交差呀?所以微软又来玩新花样了。

public partial class WebForm3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //方法一:
        Func cAdd1 = (int x, int y) => { return x + y; };
        int result1 = cAdd1(5, 6);
        //方法二:
        Func cAdd2 = (x, y) => { return x + y; };
        int result2 = cAdd2(5, 6);
        //方法三:
        Func cAdd3 = (x, y) => x + y;
        int result3 = cAdd2(5, 6);
    }
}

  不管是匿名方法还是Lambda表达式,完成一个委托的应用,都逃不过两个步骤,一步是定义一个委托,另一步是用一个方法来实例化一个委托。?微软干脆把这两步都合成一步来走了。用Func来简化一个委托的定义。

  至此一个委托的应用就可用? Func<int, int, int> cAdd3 = (x, y) => x + y;?这样一句话来完成了,其中的Func就是所谓的泛型委托。

第五分钟:表达式树

  表达式树其实与委托已经没什么关系了,非要扯上关系,那就这么说吧,表达式树是存放委托的容器。如果非要说的更专业一些,表达式树是存取Lambda表达式的一种数据结构。要用Lambda表达式的时候,直接从表达式中获取出来,Compile()就可以直接用了。如下代码:

public partial class WebForm3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Expression> exp = (x, y) => x + y;
        Func fun = exp.Compile();
        int result = fun(2, 3);
    }
}

  五分钟结束了,我点到的很肤浅,但至少让大家再温习了一篇委托,匿名方法,Lambda,泛型委托,表达式树