Saturday, January 13, 2007

使用System.Web.Mail名称空间连接需要验证的SMTP服务器

只需对增加相应标识即可:
// 使用SmtpMail对象发送邮件MailMessage mailObj = new MailMessage();

mailObj.Fields.Add(
"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); //设置需要验证
mailObj.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", username); //用户名
mailObj.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", password); //密码

注意:Fields属性只在 .NET Framework 1.1 版本以后有效。

2007/01/12 .NET Framework 2.0好像都不用这样做了。

Web服务中使用Soap标头自定义身份验证和授权

使用 Soap 标头自定义身份验证和授权

Windows 身份验证非常适合 Intranet 方案,这种情况下您是对自己的域中的用户进行身份验证。然而在 Internet 上,您可能需要对 SQL 数据库执行自定义身份验证和授权。在这种情况中,应向服务传递自定义凭据(如用户名和密码),并让服务自己处理身份验证和授权。

将额外的信息连同请求一起传递给 XML Web 服务的简便方法是通过 SOAP 标头。为此,需要在服务中定义一个从 SOAPHeader 派生的类,然后将服务的公共字段声明为该类型。这在服务的公共合同中公开,并且当从 WebServiceUtil.exe 创建代理时可由客户端使用,如下例所示:

using System.Web.Services;
using System.Web.Services.Protocols;

// AuthHeader class extends from SoapHeader
public class AuthHeader : SoapHeader {
public string Username;
public string Password;
}


public class HeaderService : WebService {
public AuthHeader sHeader;

}

服务中的每个 WebMethod 都可以使用 SoapHeader 自定义属性定义一组关联的标头。默认情况下,标头是必需的,但也可以定义可选标头。SoapHeader 属性指定公共字段的名称或者 ClientServer 类的属性(本标题中称为 Headers 属性)。在为输入标头调用方法前,WebService 设置 Headers 属性的值;而当方法为输出标头返回时,WebService 检索该值。有关输出标头或可选标头的更多信息,请参阅 .NET 框架 SDK 文档。

[WebMethod(Description="This method requires a custom soap header set by the caller")]
[SoapHeader(
"sHeader")]
public string SecureMethod() {

if (sHeader == null)
return "ERROR: Please supply credentials";
else
return "USER: " + sHeader.Username;

}

然后,客户端在调用要求标头的方法之前,直接在代理类上设置标头,如下面的示例所示:

HeaderService h = new HeaderService();
AuthHeader myHeader
= new AuthHeader();
myHeader.Username
= "JohnDoe";
myHeader.Password
= "password";
h.AuthHeader
= myHeader;
String result
= h.SecureMethod();

参见:http://chs.gotdotnet.com/quickstart/aspplus/doc/secureservices.aspx

什么是Terrarium?

这篇文章翻译自Terrarium官方网站上的一篇介绍 What is Terrarium?
还有些文档可以在这里找到,相当老的一个东西了,不过2003年的时候试过翻译Adanced Developer Guide后来半途而费了,昨天拾起来就干脆从这一篇开始了。

玩的人不多吧,感觉还是没有robocode好玩,robocode什么时候搬到sf.net上去了,呵呵。
以下是译文:

什么是Terrarium?

Terrarium微软®创建的一个编程游戏,它的目的是用于介绍.NET Framework的软件开发。在Terrarium游戏里,开发者可以创建各种生物:草食动物,肉食动物或者植物,然后可以把它们引入一个点对点的网络生态系统进行优胜劣汰竞争。这个游戏不但给大家提供了测试软件开发和战略技能的媒介,还提供了真实的评估生存竞争的各种行为和特征的进化论/人工智能模型。 Terrarium同时展示了.NET Framework的一些特性,比如利用Windows Forms集成DirectX®创建强大的用户界面(UI)XML Web services,对点对点网络的支持的,对多种编程语言的支持,通过远程Web server升级智能客户端和基于窗口的应用,和基于凭证的代码访问安全策略执行框架。这篇文章将着重讲Terrarium的技术优势,概略的介绍上面讲到的.NET Framework特性在有游戏中的角色。

游戏概述

在深入技术细节之前,让我们简要的看看如何玩这个游戏。游戏可以运行在两种模式下:

Terrarium模式在这种模式下,可以有两种选择。1----用户可以单独运行,不连接到其它任何节点。这种情况下,屏幕上表示的就是整个生态系统。这很适合于用来测试我们养的生物。2----用户也可以选择进入几个节点组成的一个小组,生态系统包括了参加的这几台计算机。这很容易,每个参与者通过在Terrarium控制台输入一个大家事先商定好的字符串,就能进入同一个频道。当然只有输入同样字符串的用户电脑才能加入想同的生态系统。

生态系统模式 – 这是标准模式,世界上所有以此模式运行的客户端都在一个大的生态系统中,每台参加的计算机都只是生态系统中的一小部分。


两种模式下,开发者都可以创建自己的生物,可以使用Terrarium类库和.NET Framework SDK或者Visual Studio .NET.或者都不创建自己的生物,而只是把Terrarium 作为一个程序运行着或者作为屏保,看别人做的生物在自己的电脑上掐架。


创建生物的时候,开发者对生物有完全的控制,包括遗传特性(视野,速度,防御力,攻击力等),行为(定位猎物,移动,攻击的算法等),繁殖(生育后代的频率,遗传给后代的信息等)。完成开发后,代码被编译为一个程序集(动态链接库,DLL),程序集可以被加载进入本地的生态系统分片,可以通过 Terrarium控制台看到。在生态系统模式,当一种生物被初始化引入时,它的10个个体就被分散在本地生态系统分片中,在整个生态系统网络中,任何人就不能再引入这种生物了,除非这种生物都死掉了。而在Terrarium模式,对同一种生物,可以引入无限多个个体。


生物一被加载入 Terrarium游戏,它就按照代码的指令行动。在被消灭之前,每个生物只被分配25毫秒的行动时间(根据计算机速度而有不同)。这样可以防止某个生物因为某种原因占用处理器,挂起系统,比如代码出现死循环。


在网络上的每个节点都有一个蓝色的心灵传送器随机的滚动,如果用户在登录过的节点运行(生态系统模式或Terrarium模式的私有频道),只要心灵传送器滚过某个生物体,这个生物就被传送到一个随机选择的节点。

界面

上面的截图是 Terrarium控制台,这里可以看到生态系统的一小片,还有一些控件,用于客户端引入生物,提供报表信息等。上面的界面和按钮都是使用Windows Forms生成的(.NET Framework中基于WindowsUI),这些易于开发的,可扩展的库高效的组合了Visual Basic的可用性和C++的强大。

生态系统的图形,包括以20帧每秒显示的生物和陆地,都是用DirectX开发的,这是一套提供给开发者对图形硬件直接控制的图形库,具有强大的优化的图形性能。有趣的是,在开发Terrarium的时候,DirectX SDK还没有托管的实现,换言之还没有基于.NET Framework的代码。其结果就是 Terrarium利用了COM Interop, 一种把原有的非托管代码并入基于.NET Framework程序的服务。调用非托管代码是很有用的一个功能,这让开发者开发新的应用时利用已存在的和继承下来的组件。


XML Web Services

XML Web service是一种在Internet或者intranet上使用Internet协议和标准以编程方式暴露其功能的应用,这些协议和标准包括SOAP,WSDLXML。基本上, XML Web services提供松耦合,基于消息的,平台中立的分布式计算模型,它允许运行在任何平台的客户机调用远程调用运行在任何平台上的服务器的功能,甚至可以穿越防火墙。


Terrarium到处都在使用XML Web services。游戏运行在一个点对点的网络,每个参与的机器都是平等的,同时作为客户端也是服务器,但是有一台主服务器用来查找节点,执行报告。节点计算机和主计算机之间就是使用XML Web services进行交互的。

验证IP地址

当一个节点第一次加载 Terrarium的实例时,它调用主服务器上的 XML Web service来看到自己向主服务器暴露的IP地址。通过比较向外暴露的IP地址和自己的本地IP地址,游戏可以知道自己的IP地址是不是被改变了,如果是被改变了的话,别的节点就不能和它通信了。比如说客户端通过代理或者网络地址转换(NAT)连接到主服务器,这样的话节点就不能加入生物系统,因为别的节点不能直接与之通信。

登录和节点发现

假定某个节点计算机有静态的公网地址,它就会调用主服务器上的另一个 XML Web service来注册到主服务器上的已登录列表。然后,主服务器返回一个包含20-30个地理相邻的IP地址列表----节点通讯录,这个列表以后用来交换生物(通过心灵传送)。这种20-30IP地址的节点通讯录以某种方式交叠,然后所有的节点就能连成一个大网络----没有任何与网络上其它部分孤立的岛。一个节点会拒绝任何不是来自于这个节点通讯录的连接请求。节点计算机每5分钟刷新一次注册状态,如果超过15分钟没有成功刷新,节点就被当做断开了网络并且从已登录列表中删除,并且在所有的节点通讯录中删除。

加载生物程序集

一旦开发者写好了生物程序集,就可以用“引入动物”按钮把生物加载进入生态系统。在后台,程序集的代码被快速的扫描保证所有关键的方法都在,没有可能用于作弊的功能。如果程序集通过检查,的、节点计算机调用主服务器上的一个 XML Web service登录这个生物,实际上也发送一个拷贝到服务器上。在这所有之后,10个生物的个体才被加载进入本地的 Terrarium生态系统分片。当生物被部署进入Terrarium 生态系统,它们就在.NET Framework基于凭证的代码访问安全策略执行框架中运行。

报告

大概每六分钟每个节点会收集在自己生态系统分片上存活的生物类型,数量信息,打包成数据集,然后发送到中心服务器上,从各个参与者节点发送过来的数据集在中心服务器被合计,然后发布在一个公共站点上做统计报告。

点对点网络

点对点网络功能是使用.NET FrameworkSystem.NetSystem.IO命名空间下的类实现的。当心灵传送器球滚过生物体,节点计算机就从主服务器给它的“节点通讯录”中随机的选取一个节点,然后询问这个节点是否已经有这个生物体的程序集,如果没有的话就把程序集通过网络流传输过去,这点在.NET Framework可以使用System.Net命名空间很容易实现。一旦生物体的程序集在接收者的本地磁盘上,生物的状态对象(包含生物的当前大小,能量等级等信息)就被用 System.Runtime.Serialization的类序列化,然后通过另一个网络流传送到接收的节点。状态对象反序列化并且和生物程序集关联以后就激活了这个生物体,结果的生物体就是发送前节点上那个生物体的精确拷贝。然后这个生物体就被插入到接收节点的生态系统分片中,最终被激活。

对多种编程语言的支持

.NET Framework支持超过20中编程语言,包括 C++, C#, COBOL, FortranJava。开发者可以选择最适合他们需求和技术的语言,而无论用什么语言编写的代码都可以和其它20几种语言编写的类透明的通讯,甚至继承别的语言编写的类。目前 Terrarium生物可以用C#或者Visual Basic .NET编写。这是为了防止作弊,就想我们以前提到的,当生物被加载时, Terrarium会扫描它的代码,保证代码没有隐藏对其它生物不公平的功能。比如说静态方法,线程调用或者析构函数都可以用来作弊,然而有些语言的编译器会自动生成静态的构造函数。 Terrarium代码扫描会检查出这样的代码不允许它们运行。将来 Terrarium会支持更多编程语言。

从远程Web服务器更新

[Terrarium 1.2版本起这个功能被去掉了]


通过防止DLL冲突和允许系统管理员通过远程Web服务器发布和升级应用,.NET Framework极大的改进了智能客户端和基于Windows的应用程序的发布过程。 Terrarium实际是使用另一个程序.NET程序升级器----来透明的处理这些工作的。这个组件(将在2月跟随MSDN文档一起发布)调用主服务器上的 XML Web service看是否有更新可用。Terrarium客户端启动30秒后就开始调用这个XML Web service,然后每15分钟再检查一次。这个XML Web service简单的比较当前节点运行的Terrarium版本和最新可用的版本,如果有新的版本,它返回新版本的下载URL.

使用 System.Net的类,节点的计算机可以在运行老版本的时候下载新文件到新的目录。数字签名可以保证新版本的文件是可靠的没有被篡改过。下载完成后,Terrarium的配置文件中,关于包含游戏UI和功能的段被修改指向到新的目录。下一次 Terrarium运行的时候,就会启动新的版本。保存上一个版本的目录还会保留,新版本如果运行出错可以返回上一个版本。再老的版本就删掉释放磁盘空间了。

基于凭证和代码访问安全性

一般来讲,.NET Framework中基于凭证的安全性使代码在不同的级别被信任,这依据代码的来源和其它一些性质,比如说作者的身份。这些性质代表的凭证被用来给这块代码赋予一个代码组或者代码分类,某个代码组或者代码分类有自己的一套许可控制决定代码能访问哪些资源。运行的时候,利用代码访问安全性技术,.NET Framework公共运行时(CLR)做底层安全检查,保证代码只执行被授权的操作。CLR不仅检查视图执行操作的代码的许可,还检查堆栈中可能调用这块程序集的代码的许可。只有在这样全面的堆栈检查之后被允许的操作才能够执行。代码组和它们对应的许可可以被设置为企业级,机器级,用户级和应用程序域级不同的级别。运行时,许可是交错的,所以实际上,机器级的设置只会比企业级的设置约束更严格。在 Terrarium中,主要的安全设置发生在应用程序域级别。在Terrarium应用程序域中,生物的代码被给予只可执行的安全许可。

总结

Terrarium提供了一个了解.NET Framework编程的非常棒的途径,一个展示.NET Framework内置技术进步的橱窗,学习进化论生物学和人工智能的强大模型工具。当然最首要和最重要的是,它是一个游戏。只要你想,开发一个生物可以非常容易,也可以非常有挑战性,可以用来玩玩,也可以用于竞技。祝你玩得尽兴,好运。


Thursday, January 11, 2007

从html到txt的转换

看到有人写了从html到txt的转换,用python做的,其实w3m(一个字符界面浏览器)一样能做到

w3m
-dump -cols 80 foo.html > bar.txt



其实我就是这样写了个脚本自动下载"街头骗子"然后转换成txt放到psp上面看的。