Skip to content

逆时针's Place

记录自己生活,学习,工作。。。

开启VPN需要的服务

—————————————————-服务器————————————————-

服务里面:
windows自带防火墙 (windows firewall/internet connection sharing(ICS))要停止(或允许1723端口)Workstation 服务 必需开启
远程注册表服务(remote Registry) 必需开启
server服务(Server)必需开启
router路由服务(Routing and Remote Access)必需开启
然后 开始–设置–控制面版–管理工具–路由和远程访问

****(本地) 右键选配置并启用路由和远程访问 下一步 选 自定义配置[选这个可以使用单网卡的情况,默认单网卡是不给开VPN服务的]

再勾选 VPN访问 和 NAT/基本防火墙 下一步 完成 是

右击****(本地)属性 IP选项卡 默认是选择动态主机配置协议(DHCP)由服务器自动分配IP

也可以选择选静态地址池,随便添个内网IP范围 例如:起始IP地址:192.168.8.2 结束IP地址192.168.8.254

确定保存!注意这里的内网IP并不是指VPN服务器所在的局域网IP,而仅仅只针对VPN服务器和使用该VPN服务的客户端,这个内网只针对这两者。如VPN服务器所在的局域网段为:210.43.118.1-210.43.118.254,而客户机所在的局域网段为:211.69.2.1-211.69.2.254,客户机想通过拨vpn使用210.43.118网段的资源,vpn服务器上的ip选项卡的静态地址池与这两个网段没有任何关系,如你可以配置成192.168.3.1-192.168.3.200

下一步找到IP路由选择 → NAT/基本防火墙 右键 选择第一个 新增接口 在这里选本地连接 公用接口连接到Internet 在此接口上启用NAT 前勾上

确定保存!退出

在到计算机管理→本地用户和组–用户 选一个要拨入的用户 点 右键 属性 拨入选项卡 选允许拨入 确定

这样VPN就基本设置就完成了。

—————————————————-本机上的操作————————————————-

下面配置自己的机子连接VPN

网上邻居 右键属性 新建连接向导 下一步 选‘连接到我的工作场所的网络’

下一步 选虚拟网络专用连接 随便输入一个公司名 下一步 输入服务器IP或(域名) 完成

输入刚刚设置的拨入用户 连接进去之后

在CMD下输入 IPCONFIG -ALL 可以发现多了一个IP地址了

好了在去www.ip138.com先看下没连接VPN之前的IP

用VPN连接之后在看看IP

自己现在的IP是不和VPN服务器的一样了!

这样代理服务器就弄好了

注意,有一步一定不能少,否则就不能共享上网了:
找到IP路由选择 → NAT/基本防火墙 右键 选择第一个 新增接口 在这里选本地连接 公用接口连接到Internet 在此接口上启用NAT 前勾上

问题如题,当使用HttpWebRequest时,遇到请求的返回结果是500等错误时,HttpWebRequest的GetResponse()方法就会报出异常Http500错误,取不到想要的Response内容。

可以这样获取:

(HttpWebResponse)httpRqst.GetResponse();
}
catch (WebException ex)
{
httpRspn = (HttpWebResponse)ex.Response;
}

问题解决~

在WPFToolkit中包含了DataGrid,AutoCompleteBox,Accordion,Rating等等,我们常用的控件。

WPFToolkit官方网站

Installation and Usage Instructions
Please note: The WPF Toolkit is dependent on .NET Framework 3.5 SP1. You must install .NET Framework 3.5 SP1 in order to use any features in the Toolkit.

Instructions for using the WPF Toolkit binaries:
Install .NET Framework 3.5 SP1
If you have a previous version of WPF Toolkit installed, uninstall it through the Remove Programs dialog on the Control Panel (look for “WPF Toolkit October 2008″ or “WPF Toolkit January 2009″ or “WPF Toolkit March 2009″ or “WPF Toolkit June 2009″)
Download the WPFToolkit_Binaries or WPFToolkit_BinariesAndSource
Run the WPFToolkit.msi to install the WPFToolkit.dll and WPF Toolkit design time binaries to your Program Files folder
Reference the binaries in your project:
Reference WPFToolkit.dll in your project
Add a using statement (“using Microsoft.Windows.Controls;”) to the top of .cs files
Add a new xmlns (for example, xmlns:toolkit=”http://schemas.microsoft.com/wpf/2008/toolkit”) to the top of XAML files
Remember to use the namespace prefix (in the above example, ) in the body of your XAML、

1.下载 WPFToolkit.msi

2.安装 WPFToolkit.msi

3.引用 WPFToolkit.dll到你的项目

4. 在.cs文件中加入using Microsoft.Windows.Controls;

5.在 .xaml文件中加入xmlns:toolkit=”http://schemas.microsoft.com/wpf/2008/toolkit”

6.然后在使用<toolkit:使用控件

DropDownList则与TextBox等控件不同,它使用的是select标记。它需要两个值:在下拉框中显示的列表,和默认选项。而自动绑定一次只能绑定一个属性,因此你需要根据需要选择是绑定列表,还是默认选项。

DropDownList扩展方法的各个重载版本“基本上”都会传递到这个方法上:

public static string DropDownList(this HtmlHelper htmlHelper,
    string name,
    IEnumerable<SelectListItem> selectList,
    string optionLabel,
    IDictionary<string, object> htmlAttributes) {
    …
} 

如果没有指定selectList,该方法将自动绑定列表,即从ViewData中查找name所对应的值。如果提供了selectList,将自动绑定默认选项,即从selectList中找到Selected属性为true的SelectedListItem。(具体参见HtmlHelper方法的SelectInternal辅助方法)

例1:如果在Action方法中有如下代码:


List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem { Text = "Kirin", Value = "29" });
items.Add(new SelectListItem { Text = "Jade", Value = "28", Selected = true});
items.Add(new SelectListItem { Text = "Yao", Value = "24"});
this.ViewData["list"] = items; 

在View中这样使用:

<%=Html.DropDownList("list")%>那么辅助方法将率先从ViewData中获取key为list的项,如果该项为IEnumerable类型则绑定到下拉框中,否则将抛出InvalidOperationException。由于第二个SelectListItem的Selected为true,则默认选中第二个。

例2:如果Action中代码如下:

List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem { Text = "Kirin", Value = "29" });
items.Add(new SelectListItem { Text = "Jade", Value = "28"});
items.Add(new SelectListItem { Text = "Yao", Value = "24"});
this.ViewData["list"] = items;
this.ViewData["selected"] = 24; 

<%=Html.DropDownList("selected", ViewData["list"] as IEnumerable)%> 

那么辅助方法将ViewData["list"]绑定为下拉框,然后从ViewData中获取key为selected的项,并将下list中Value值与该项的值相等的SelecteListItem设为默认选中项。

以上两种方法尽管可以实现DropDownList的正确显示,但并非最佳实践。在实际项目中,我们更希望在代码中使用强类型。例如上面两例中,SelectListItem的Text和Value本来是User对象的Name和Age属性,然而上面的代码却丝毫体现不出这种对应关系。如果User列表是从数据库或其他外部资源中获得的,我们难道要用这样的方式来绑定吗?

var users = GetUsers();
foreach (var user in users)
{
    items.Add(new SelectListItem { Text = user.Name, Value = user.Age.ToString() });
} 

这显然是我们所无法容忍的。那么什么是最佳实践呢?

ASP.NET MVC为DropDownList和ListBox(都在html中使用select标记)准备了一个辅助类型:SelectList。SelectList继承自MultiSelectList,而后者实现了IEnumerable。也就是说,SelectList可以直接作为Html.DropDownList方法的第二个参数。

MultiSelectList包含四个属性,分别为:

Items:用于在select标记中出现的列表,通常使用option标记表示。IEnumerable类型。

DataTextField:作为option的text项,string类型。

DataValueField:作为option的value项,string类型。

SelectedValues:选中项的value值,IEnumerable类型。

显然,作为DropDownList来说,选中项不可能为IEnumerable,因此SelectList提供了一个新的属性:

SelectedValue:选中项的value值,object类型。

同时,SelectList的构造函数如下所示:

public SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue)
    : base(items, dataValueField, dataTextField, ToEnumerable(selectedValue)) {
    SelectedValue = selectedValue;
} 

于是我们的代码变为:

var users = GetUsers();
var selectList = new SelectList(users, "Age", "Name", "24");
this.ViewData["list"] = selectList;
<%=Html.DropDownList("list")%> 

当然,你也可以使用不带selectedValue参数的构造函数重载,而在view中显式指定IEnumerable,并在ViewData或view model中指定其他与DropDownList同名的项作为默认选项。

最后让我们来回顾一下DropDownList的三种用法:

建立IEnumerable并在其中指定默认选中项。

建立IEnumerable,在单独的ViewData项或view model的属性中指定默认选中项。

使用SelectList。

PPCBlog发表了一张图片,详细解释了网页从被Google的网络蜘蛛爬取、收录、索引,最后再到用户进行一次Google搜索并产生搜索结果的过程,图中还描述了Google Adwords在搜索中产生的过程。 图片简洁明了,对了解Google搜索非常的直观,我们将其编译成中文,下面就是编译成中文Google如何完成一次用户搜索的图片:

如果你希望在什么说明文件都没有的情况下调用DLL的函数,那么你不会成功,因为DLL中只包括函数的名字,不包括函数的参数和调用方法这样的信息。使用VC的dumpbin(在Bin目录中)或Delphi的TDump,你可以得到DLL中包括哪些函数,但这些函数是什么意义、怎么调用是无法知道的。
  在资源管理器里右击鼠标,选快速查看(QuickView)也能看到dll的导出函数。遗憾的是也没办法看到用法。(注:Windows默认是不安装QuickView的,如果想安装需要从控制面板选择“添加/删除程序”添加QuickView)
  用TDump.exe(delphi5里有)可以将该dll的信息导出到其他文件中。用法:
  tdump my.dll a.txt
  or
  tdump my.dll > a.txt
  然后可以查看a.txt文件
  一个办法是利用命令行工具Dumpbin(在Bin目录中),当使用/EXPORTS参数,你可以看到DLL中有哪些函数。另一个办法是使用VC++ 6.0以上版本的工具Dependency Walker,这个工具很容易使用,也可以看到其中有哪些函数可用。但是不管哪个工具都只能知道有哪些函数,而不能知道如何调用这些函数。

viewstate , session , cookie是三种记录网页内部参数值的方法,但是三者之间又各有不同.

viewstate

viewstate的值保存在浏览器的html代码中 , 当浏览器关闭 , 则值消失 , 即viewstate是在本页面之内各函数间进行传值的 , 至于为什么要使用这种方法 , 因为在一个事件发生之后 , 页面可能会刷新 , 如果定

相信大多数.Net程序员都有使用Reflactor的经历。无论出于什么目的,当用Reflactor反编译托管程序后,还想对其代码加以修改,那么本文所列举的可能是一份有用的参考。

用Reflactor的FileGenerator插件反编译代码后可以得到包括项目文件的源代码,但代码中存在各种问题,一般无法一次编译通过,以下将详谈这些问题:
枚举问题

为了代码可读,可能需要花点时间查阅metadata把int值修改回枚举值,尤其是想利用窗体设计器的,VS2008可能还不理解int值。
属性问题

比如一个叫Names的属性被反编译后,可能还原为的set_Names(names),get_Names()方法,逐个替换可能很慢,可采用正则表达式整体替换。
对于set_Xxx(xxx)方法,可替换
set_{[a-z]*}\(

\1 = (
对于get_Xxx()方法,可替换
get_{[a-z]*}\(\)

\1
然后,再修复个别被误换的方法。
委托和回调函数问题

一般会被还原为add_Xxx(MethodsName)方法,需要改为 += MethodsName
资源问题

需要使用.Net Framework SDK 下的 resgen.exe 工具,反编译嵌入资源文件*.resources为*.resx文件,
语法为:ResGen.exe *.resources *.resx,然后将*.resx包含入项目,就会自动和同名的窗体文件*.cs关联,如果没有关联可采用先排除再添加大法,一一搞定。
命名空间问题

如果需要切换到IDE的窗体设计器,而不出错,则还需要在*.cs中添加比如System.Windows.Forms的命名空间前缀。
窗体设计器识别问题

需要把以下代码
ComponentResourceManager manager = new ComponentResourceManager(typeof(ClassName));
替换为
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ClassName));
窗体设计器才能正常识别。

今天更改老程序的Bug,也就是SQL字符串的拼接的改成采用SqlParameter方式。

遇到了如题的问题,我的原因是由于 SqlParameterCollection中的一个SqlParameter没有指明的赋值,导致报异常。

//这样会报异常

new System.Data.SqlClient.SqlParameter("@photo", 0);
//这样不会报异常

SqlParameter sp = new System.Data.SqlClient.SqlParameter("@photo", SqlDbType.Bit);
sp.Value = 0;

很是气愤,算是。Net的一个BUG吧。

一、配置主备机

1、 物理连接

将主备数据库按照如图所示连接:

2、 检查SQL Server 2005数据库

只有SQL Server 2005 标准版、企业版和开发版才可以建立数据镜像。其他版本即Express只能作为见证服务器。如果实在不清楚什么版本,执行如下语句查看:

select @@version;

若要对此数据库进行数据库镜像,必须将它更改为使用完整恢复模式。若要用 Transact-SQL 实现此目的,请使用 ALTER DATABASE 语句:

USE master;
 ALTER DATABASE <DatabaeName> 
 SET RECOVERY FULL;

 

 

二、主备实例互通

实现互通可以使用域或证书来实现,考虑实现的简单,以下选取证书的方式实现。注意:实现“主备数据库实例互通”的操作只需要做一次,例如为了将两个SQL Server 2005的实例中的5个数据库建成镜像关系,则只需要做一次以下操作就可以了;或者这样理解:每一对主备实例(不是数据库)做一次互通。

1、创建证书(主备可并行执行)

–主机执行:

USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'killkill';
CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' , 
START_DATE = '01/01/2010';

–备机执行:

USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'killkill';
CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate', 
START_DATE = '01/01/2008';

 

2、创建连接的端点(主备可并行执行)

–主机执行:

CREATE ENDPOINT Endpoint_Mirroring 
STATE = STARTED 
AS 
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) 
FOR 
DATABASE_MIRRORING 
( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );

–备机执行:

CREATE ENDPOINT Endpoint_Mirroring 
STATE = STARTED 
AS 
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) 
FOR 
DATABASE_MIRRORING 
( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );

 

3、备份证书以备建立互联(主备可并行执行)

–主机执行:

BACKUP CERTIFICATE HOST_A_cert TO FILE = 'D:\SQLBackup\HOST_A_cert.cer';

 –备机执行:

BACKUP CERTIFICATE HOST_B_cert TO FILE = 'D:\SQLBackup\HOST_B_cert.cer';

 

4、互换证书

将备份到D:\SQLBackup\的证书进行互换,即HOST_A_cert.cer复制到备机的D:\SQLBackup\。HOST_B_cert.cer复制到主机的D:\SQLBackup\

5、添加登陆名、用户(主备可并行执行)

以下操作只能通过命令行运行,通过图形界面无法完成。(截至文档编写结束,SQL Server2005的不定号为SP2)

–主机执行:

CREATE LOGIN HOST_B_login WITH PASSWORD = 'killkill';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:\SQLBackup\HOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];

–备机执行:

CREATE LOGIN HOST_A_login WITH PASSWORD = 'killkill';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'D:\SQLBackup\HOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];

 

三、建立镜像关系

以下步骤是针对每个数据库进行的,例如:现有主机中有5个数据库以下过程就要执行5次。

1、 手工同步登录名和密码

在第一章中提到数据库镜像的缺点之一是无法维护登录名,所以需要我们手工维护登录。

通常来说数据库都将会有若干个用户作为访问数据库的用户,并且数据库会有相应的登录名,但是在备机中缺少与之相对应的登录名,例如某业务系统使用’myuser’作为登录名访问数据库,但是在备机中没有’myuser’这个登录名,因此一旦主备切换,业务系统就无法登录数据库了,这种情况称为”孤立用户”

在主数据库中执行如下语句:

USE master;
select sid,name from syslogins;

查找出相应的用户名和sid,例如:上述的’myuser’

在备数据库中执行如下语句:

USE master;
exec sp_addlogin 
@loginame = '<LoginName>', 
@passwd = '<Password>', 
@sid = <sid> ;

这里的’LoginName’即主数据库中的登录名,sid即是上述通过SQL语句查找出的sid。

例如,查询得到的sid和name如下所示。

sid name
---------------------------------- -----------------
0x074477739DCA0E499C29394FFFC4ADE4 cz_account

则建立登录名的SQL语句:

USE master;
exec sp_addlogin 
@loginame = 'cz_account', 
@passwd = 'password', 
@sid = 0x074477739DCA0E499C29394FFFC4ADE4;

到此为止可以认为备机数据库的环境已经与主机同步了,还差数据库内的数据未同步。

2、 准备备机数据库

承接上文,该节是描述如何同步主备数据库内的数据。

可以尝试从刚刚使用的全备文件进行还原,在还原数据的时候需要使用选上“with non recover”。如图所示:

如果执行成功数据库将会变成这个样子:clip_image008

3、 建立镜像

由于是实验,没有为服务器配置双网卡,IP地址与图有点不一样,但是原理一样。

–主机执行:

ALTER DATABASE shishan SET PARTNER = 'TCP://10.168.6.45:5022';

–如果主体执行不成功,尝试在备机中执行如下语句:

ALTER DATABASE shishan SET PARTNER = 'TCP://10.168.6.49:5022';

如果执行成功,则主备数据库将会呈现如上图所示的图标。

如果建立失败,提示类似数据库事务日志未同步,则说主备数据库的数据(日志)未同步,为保证主备数据库内的数据一致,应在主数据库中实施一次“事务日志”备份,并还原到备数据库上。备份“事务日志”如图所示:

还原事务日志时需在选项中选择“restore with norecovery”,如图所示:

成功还原以后再执行建立镜像的SQL语句。

四、测试操作

1、主备互换

–主机执行:

USE master;
ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER;

2、主服务器Down掉,备机紧急启动并且开始服务

–备机执行:

USE master;
ALTER DATABASE <DatabaseName> SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;

3、原来的主服务器恢复,可以继续工作,需要重新设定镜像

--备机执行:
USE master;
ALTER DATABASE <DatabaseName> SET PARTNER RESUME; --恢复镜像
ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; --切换主备

4、原来的主服务器恢复,可以继续工作

--默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且SQL Server 2005 标准版只支持同步模式。

--关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。

USE master;
ALTER DATABASE <DatabaseName> SET PARTNER SAFETY FULL; --事务安全,同步模式
ALTER DATABASE <DatabaseName> SET PARTNER SAFETY OFF; --事务不安全,异步模式

  

clip_image015

 

clip_image013

 

clip_image011

 

clip_image009

 

clip_image006

 

clip_image004