月度归档:2012 年三月

log4net

[xml]
<?xml version="1.0" encoding="utf-8"?>
<!–
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站”->“Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
/Windows/Microsoft.Net/Framework/v2.x/Config 中
–>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<log4net>
<logger name="loggerAX">
<!–control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF–>
<!–如果没有定义LEVEL的值,则缺省为DEBUG–>
<level value="ALL" />
<appender-ref ref="ColoredConsoleAppender"></appender-ref>
<appender-ref ref="FileAppenderAX"></appender-ref>
</logger>

<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="ALL" />
<foreColor value="White" />
<backColor value="Red, HighIntensity" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" />
</layout>
</appender>

<appender name="FileAppenderAX" type="log4net.Appender.RollingFileAppender">
<!–绝对路径–>
<file value="D://AX.txt"></file>
<!–相对路径,在项目的根目录下–>
<!–以最后一个路径为准,所以上面的绝对路径下不会写日志–>
<file value="./Log/AX.txt"></file>
<!–防止多线程时不能写Log,官方说线程非安全–>
<!–实际使用时,本地测试正常,部署后有不能写日志的情况–>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appendToFile value="true" />
<!–可以为:Once|Size|Date|Composite–>
<!–Composite为Size和Date的组合–>
<rollingStyle value="composite" />
<!–日志最大个数,都是最新的–>
<!–rollingStyle节点为Date时,该节点不起作用–>
<!–rollingStyle节点为Size时,只能有value个日志–>
<!–rollingStyle节点为Composite时,每天有value个日志–>
<maxSizeRollBackups value="10" />
<!–当备份文件时,为文件名加的后缀–>
<!–后缀为*.txt时,例:AX.txt_2008-07-24.PxP 应该是程序上的一个bug–>
<!–后缀为*.TXT时,例:AX.txt_2008-07-25.TXT–>
<datePattern value="_yyyy-MM-dd.TXT" />
<!–可用的单位:KB|MB|GB–>
<!–不要使用小数,否则会一直写入当前日志–>
<maximumFileSize value="1KB" />
<!–置为true,当前最新日志文件名永远为file节中的名字–>
<staticLogFileName value="true" />
<!–输出级别在INFO和ERROR之间的日志–>
<!–<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="ERROR" />
</filter>–>
<!–必须结合起来用,第一个只过滤出WARN,第二个拒绝其它其它日志输出–>
<filter type="log4net.Filter.LevelMatchFilter">
<param name="LevelToMatch" value="WARN" />
</filter>
<!–<filter type="log4net.Filter.DenyAllFilter" />–>

<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] – %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
[/xml]

怎样增加网站外部链接[转]

我发现有很多的朋友对于怎样发外部链接还是不是很明白,还是感到非常的头痛,我前面写了清远seo:如何增加反向链接看来还是不够,因此现在又来给大家总结一些发外链的方法,教大家怎样发外链。

1、先说简单的,让大家比较容易记住以及操作。在论坛的签名上带上链接。现在是有很多的论坛签名上都是可以带上链接的,应该大家都会有些常去的论坛,可以在论坛的签名档上写上自己网站的链接,平时的时候可以多多的发些帖子,以及多多的回回别人的帖子,这样子就可以增加外链了,这样的论坛是有很多的,大家最好自己找找,找到好的就收藏起来。


2、到一些经常更新的博客上进行留现在又很多的博客的,而且有很多人的博客都是经常的更新的,权重也很高,可以到这些博客上进行留言,博客的作者一般都会回访你的,这样子就可以一直的进行下去了。


3、用博客营销的方法来进行,现在免费的博客是非常多的,你一搜的话就一大堆了,可以找些权重比较高的,然后就创建博客,一般的博客都是有添加友情链接的功能的,你就可以添加上自己的网站了,然后可以发两篇文章,不要直接复制,也是最好伪一下,有时间的话,可以不定期的发些文章,只要收录了就可以了,就不用发了,这样你可以建很多很多的免费博客。


4、把网站提高到一些RSS阅读器中
RSS阅读器都是订阅的,就是把网站订阅都一些RSS阅读器中,这些阅读器是很多的,可以在网上搜一下,比如Google Reader、Bloglines、抓虾等等。

5、可以找一些专门发外链的地方以及提交网站的地方
这些地方也是有很多的,大家可以在百度以及谷歌上搜一下。比如你可以搜友情链接专贴、提交网站、Sub url、Add url等关键词,你可以找到很多提供外链资源的网页了,不用就浪费了。
6、写一些高质量的软文进行投稿
高质量的软文是非常厉害的,你可以抽点时间出来写一些高质量的软文,到一些大型网站进行投稿,比如A5就是很好的投稿地方,在文章中带上自己网站的链接,因为你的软文质量高,是很容易通过的,而这些投稿的地方每天都是有很多的人来转载文章的,所以一篇好的软文最小也能够给你带来几十到几百的外链,多的话会有几千。


7、可以建一些免费的站点
大家都知道现在的免费空间是很多的,免费的域名也有不少,你可以建很多个不同的网站,网站上都带上你的网站链接,只要收录了就又是一个外链了,这些都是免费的,你只要去做就可以了。
好了,就先总结这些,加上之前的方法,已经足够大家用的了,其实你只要用好了其中的两三种方法就足够了,以后有新的方法再告诉大家。


最后提醒大家注意:外链最重要在质量上面,光有数量是不够的。不要再短时间内增加很多的外链。保持每天一定数量就行了。做外链最重要的是坚持。只要你坚持去做,你的网站的外链就会非常的强大了。

.net Web Service 身份验证

解决方案一:通过通过SOAP Header身份验证。

1.我们实现一个用于身份验证的类,文件名MySoapHeader.cs

MySoapHeader类继承自System.Web.Services.Protocols.SoapHeader。且定义了两个成员变量,UserName和PassWord,还定义了一个用户认证的函数ValideUser。它提供了对UserName和PassWord检查的功能

[csharp]
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.Services;
using System.Web.Services.Protocols;
/// <summary>
///MySoapHeader 的摘要说明
/// </summary>
public class MySoapHeader:SoapHeader
{
public MySoapHeader()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public string UserName;
public string PassWord;
public bool ValideUser(string in_UserName, string in_PassWord)
{
if ((in_UserName == "tuser") && (in_PassWord == "123456"))
{
return true;
}
else
{
return false;
}
}
}

[/csharp]

2.下面我们创建WebService.asmx WebService.cs代码如下:

[csharp]
using System;
using System.Collections;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

/// <summary>
///WebService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{

public WebService()
{

//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
public MySoapHeader header; ////定义用户身份验证类变量header
[WebMethod(Description = "用户验证测试")]
[System.Web.Services.Protocols.SoapHeader("header")]//用户身份验证的soap头
public string HelloWorld(string contents)
{
//验证是否有权访问
if (header.ValideUser(header.UserName, header.PassWord))
{
return contents + "执行了";
}
else
{
return "您没有权限访问";
}
}
}

[/csharp]

3.客户端 创建个Default.aspx

Default.aspx .cs代码

[csharp]
using System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
com.cn1yw.WebService test = new com.cn1yw.WebService();//web引用(改成您自己的)
com.cn1yw.MySoapHeader Header = new com.cn1yw.MySoapHeader();//web引用创建soap头对象(改成您自己的)
//设置soap头变量
Header.UserName = "zxq";
Header.PassWord = "123456";
test.MySoapHeaderValue = Header;
//调用web 方法
Response.Write(test.HelloWorld("我是强"));
}
}

[/csharp]
解决方案二:通过集成windows身份验证。
1. 将web服务程序设为集成windows身份验证

2.客户端web引用代码
[csharp]
Test.WebReference.Service1 wr = new Test.WebReference.Service1(); //生成web service实例
wr.Credentials = new NetworkCredential("guest","123"); //guest是用户名,该用户需要有一定的权限
lblTest.Text = wr.Add(2,2).ToString(); //调用web service方法

[/csharp]

使用ServiceStackRedis链接Redis简介[转]

目前网上有一些链接Redis的C#客户端工具,这里介绍其中也是目前我们企业版产品中所使用的ServiceStackRedis, 链接地址:

https://github.com/mythz/ServiceStack.Redis

下面该链接中的源码包或dll文件,引入到项目中,并添加如下名空间引用(仅限本文):

using ServiceStack.Common.Extensions;
using ServiceStack.Redis;
using ServiceStack.Redis.Generic;
using ServiceStack.Text;
using ServiceStack.Redis.Support;

注:ServiceStackRedis封装了大量方法和对象,这里只摘有代表性的内容介绍,更多内容参见其官方文档。

声明一个客户端对象:
protected RedisClient Redis = new RedisClient(“10.0.4.227″, 6379);//redis服务IP和端口

一 .基本KEY/VALUE键值对操作:
1. 添加/获取:

  List<string> storeMembers = new List<string>();
storeMembers.ForEach(x => Redis.AddItemToList(“additemtolist”, x));

注:也可直接使用AddRangeToList方法将一组数据装入如:

Redis.AddRangeToList(“addarrangetolist”, storeMembers);

 

2. 获取数据

  var members = Redis.GetAllItemsFromList(“additemtolist”);
members.ForEach(s => Response.Write(“<br/>additemtolist :” + s));

3. 获取指定索引位置数据

var item = Redis.GetItemFromList(“addarrangetolist”, 2);

4. 移除:

  var list = Redis.Lists["addarrangetolist"];
list.Clear();//清空
list.Remove(“two”);//移除指定键值
list.RemoveAt(2);//移除指定索引位置数据

 

二.存储对象:

    public class UserInfo
{
public long Id { set; get; }
public string UserName { get; set; }
public int Age { get; set; }
}

1.通常方式(底层使用json序列化):

  Redis.Set<UserInfo>(“userinfo”, new UserInfo() { UserName = ”李四”, Age = 45 });
UserInfo userinfo = Redis.Get<UserInfo>(“userinfo”);

注:当然上面方式也适合于基本类型,如:

    Redis.Set<int>(“my_age”, 12);//或Redis.Set(“my_age”, 12);
int age = Redis.Get<int>(“my_age”);

2.object序列化方式存储:

  var ser = new ObjectSerializer();    //位于namespace ServiceStack.Redis.Support;
bool result = Redis.Set<byte[]>(“userinfo”, ser.Serialize(new UserInfo() { UserName = ”张三”, Age = 12 }));
UserInfo userinfo = ser.Deserialize(Redis.Get<byte[]>(“userinfo”)) as UserInfo;
//也支持列表
Redis.Set<byte[]>(“userinfolist_serialize”, ser.Serialize(userinfoList));
List<UserInfo> userList = ser.Deserialize(Redis.Get<byte[]>(“userinfolist_serialize”)) as List<UserInfo>;

需要说明的是在测试过程中发现JSON序列化的效率要比object序列化高一些。

三.存储表格对象,比如:

  using (var redisUsers = Redis.GetTypedClient<UserInfo>())
{
redisUsers.Store(new UserInfo { Id = redisUsers.GetNextSequence(), UserName = ”daizhj”, Age = 12 });
redisUsers.Store(new UserInfo { Id = redisUsers.GetNextSequence(), UserName = ”daizhenjun”, Age = 13 });

var allUsers = redisUsers.GetAll();//就像操作ado对象一样,可以进行CRUD等操作
allUsers.ForEach(s => Response.Write(“<br/>user :” + s.UserName + ” age:” + s.Age));
}

四.使用客户端链接池模式提升链接速度:

  public static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts)
{
//支持读写分离,均衡负载
return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
{
MaxWritePoolSize = 5,//“写”链接池链接数
MaxReadPoolSize = 5,//“写”链接池链接数
AutoStart = true,
});
}

声明链接池对象(这里只使用一个redis服务端):

  PooledRedisClientManager prcm = CreateManager(new string[] { ”10.0.4.210:6379″ }, new string[] { ”10.0.4.210:6379″ });

List<UserInfo> userinfoList = new List<UserInfo>();
userinfoList.Add(new UserInfo() { UserName = ”pool_daizhj”, Age = 1 });
userinfoList.Add(new UserInfo() { UserName = ”pool_daizhj1″, Age = 2 });

从池中获取一个链接:

  using (IRedisClient Redis = prcm.GetClient())
{
Redis.Set(“userinfolist”, userinfoList);
List<UserInfo> userList = Redis.Get<List<UserInfo>>(“userinfolist”);
}

 

注:
1.前三种方式我在本地测试发现存取效率从高到底,具体原因还待分析。

2.如只想使用长链接而不是链接池的话,可以直接将下面对象用static方式声明即可:
protected static RedisClient Redis = new RedisClient(“10.0.4.227″, 6379);

这样在redis服务端显示只有一个客户链接

3.与memcached测试过程中发现,在存储时两者效率接近(使用本文第一种方式),在取数据时memcached速度比redis要快一些(毫秒级差异),这一点并不像网上一些文章所说的那样,看来在实际开发和生产环境下还要以使用背景及结果为准。
测试代码下载链接:

/Files/daizhj/Redis.Sample.rar

http://www.cnblogs.com/xiangboren/archive/2011/12/03/2274661.html

ServiceStack.Redis 使用教程[转]

环境准备

在Windows上运行Redis服务器作开发和测试是很好的,但是在运营环境还是Linux版本靠谱,下面我们就先解压Redis到一个目录下:

image

运行redis-server.exe 看到如下Windows控制台:

image

上面我们可以看到Redis运行的端口是6372

我们先玩一下Redis的客户端控制台,在相同目录下运行redis-cli.exe会弹出另一个控制台程序,可以参考Try Redis tutorial开始你的交互之旅。

输入命令 set car.make “Ford” 添加了一个car.make为Key,Value是Ford的数据进入Redis,输入命令get car.make就可以取回Ford

image

下面我们进入正题,讲主角ServiceStack.Redis :

首先创建一个控制台程序,然后解压缩ServiceStack.Redis-v3.00.zip ,然后添加下面的四个引用

  • ServiceStack.Common
  • ServiceStack.Interfaces
  • ServiceStack.Redis
  • ServiceStack.Text

image

我们下面来写些代码,创建一个Car类并存储几个实例到Redis,然后让一个对象5秒后过期,等待6秒钟后输出Car的实例数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ServiceStack.Redis;
using System.Threading;

namespace RedisTutorial
{
class Program
{
static void Main(string[] args)
{
var redisClient = new RedisClient(“localhost”);

using (var cars = redisClient.GetTypedClient<Car>())
{
if (cars.GetAll().Count > 0)
cars.DeleteAll();

var dansFord = new Car
{
Id = cars.GetNextSequence(),
Title = “Dan’s Ford”,
Make = new Make { Name = “Ford” },
Model = new Model { Name = “Fiesta” }
};
var beccisFord = new Car
{
Id = cars.GetNextSequence(),
Title = “Becci’s Ford”,
Make = new Make { Name = “Ford” },
Model = new Model { Name = “Focus” }
};
var vauxhallAstra = new Car
{
Id = cars.GetNextSequence(),
Title = “Dans Vauxhall Astra”,
Make = new Make { Name = “Vauxhall” },
Model = new Model { Name = “Asta” }
};
var vauxhallNova = new Car
{
Id = cars.GetNextSequence(),
Title = “Dans Vauxhall Nova”,
Make = new Make { Name = “Vauxhall” },
Model = new Model { Name = “Nova” }
};

var carsToStore = new List<Car> { dansFord, beccisFord, vauxhallAstra, vauxhallNova };
cars.StoreAll(carsToStore);

Console.WriteLine(“Redis Has-> ” + cars.GetAll().Count + ” cars”);

cars.ExpireAt(vauxhallAstra.Id, DateTime.Now.AddSeconds(5)); //Expire Vauxhall Astra in 5 seconds

Thread.Sleep(6000); //Wait 6 seconds to prove we can expire our old Astra

Console.WriteLine(“Redis Has-> ” + cars.GetAll().Count + ” cars”);

//Get Cars out of Redis
var carsFromRedis = cars.GetAll().Where(car => car.Make.Name == “Ford”);

foreach (var car in carsFromRedis)
{
Console.WriteLine(“Redis Has a ->” + car.Title);
}

}
Console.ReadLine();
}
}

public class Car
{
public long Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public Make Make { get; set; }
public Model Model { get; set; }
}

public class Make
{
public int Id { get; set; }
public string Name { get; set; }
}

public class Model
{
public int Id { get; set; }
public Make Make { get; set; }
public string Name { get; set; }
}

}

image

例子代码下载:RedisTutorial.zip

ServiceStack.Redis的问题与修正

性能测试:Redis千万级的数据量的性能测试

几点建议,让Redis在你的系统中发挥更大作用

windows server远程桌面漏洞

补丁下载地址:

http://technet.microsoft.com/en-us/security/bulletin/ms12-020

据说连续发包就会导致系统蓝屏
General Information
Executive Summary
This security update resolves two privately reported vulnerabilities in the Remote Desktop Protocol. The more severe of these vulnerabilities could allow remote code execution if an attacker sends a sequence of specially crafted RDP packets to an affected system. By default, the Remote Desktop Protocol (RDP) is not enabled on any Windows operating system. Systems that do not have RDP enabled are not at risk.

This security update is rated Critical for all supported releases of Microsoft Windows. For more information, see the subsection, Affected and Non-Affected Software, in this section.

The security update addresses the vulnerabilities by modifying the way that the Remote Desktop Protocol processes packets in memory and the way that the RDP service processes packets. For more information about the vulnerabilities, see the Frequently Asked Questions (FAQ) subsection for the specific vulnerability entry under the next section, Vulnerability Information.

Recommendation. The majority of customers have automatic updating enabled and will not need to take any action because this security update will be downloaded and installed automatically. Customers who have not enabled automatic updating need to check for updates and install this update manually. For information about specific configuration options in automatic updating, see Microsoft Knowledge Base Article 294871.

For administrators and enterprise installations, or end users who want to install this security update manually, Microsoft recommends that customers apply the update immediately using update management software, or by checking for updates using the Microsoft Update service.

See also the section, Detection and Deployment Tools and Guidance, later in this bulletin.

Known Issues. Microsoft Knowledge Base Article 2671387 documents the currently known issues that customers may experience when installing this security update. The article also documents recommended solutions for these issues.

解决html文件缓存的方法

因为网站的的广告是以iframe嵌入的html,有时改了却刷新不了。必须得单独打开html,然后ctrl+f5强制刷新才出来。
网上搜了下,大约有几种方法:
1.更改html头
[html]<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-store, must-revalidate" />
<meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT" />
<meta http-equiv="expires" content="0" />
[/html]
2.给文件加上动态参数,如:
[html]
<iframe src="http://www.example.com/thepage.html" name="aframe"></iframe>
<script type="text/javascript">
document.frames['aframe'].location.href += (document.frames['aframe'].location.href.indexOf("?") != -1 ? "?" : "&") + (new Date()).getTime();
</script>
[/html]

c#除法运算的问题

最近写c#程序时遇到一个自已感觉有点奇怪的问题,

[csharp]
double c = a/b;
if(c<10000 && c>0.0001)
{
k.value = d;
}
[/csharp]

本来是想判断如果a和b的差值比较大的情况下就不更新数据库的。

如果a大于b问题不大,但当a小于b的时候,c的值有可能是0.00

网上查了一下,说是必须得先把被除数转成十进制才可以,即:

[csharp]
decimal c = (decimal)a/b;
if(c<10000 && c>(decimal)0.0001)
{
k.value = d;
}
[/csharp]

详细描述,请参考http://www.cnblogs.com/GIS_zhou/articles/1818986.html