RSS

Monthly Archives: 八月 2004

.Net 1.1 SP1 & .Net 1.0 SP3 is out.

.Net Framework 1.1 SP1:
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=A8F5654F-088E-40B2-BBDB-A83353618B38

.Net Framework 1.1 SP1 for Win2003:
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=AE7EDEF7-2CB7-4864-8623-A1038563DF23

.Net Framework 1.0 SP3:
http://www.microsoft.com/downloads/details.aspx?familyid=6978D761-4A92-4106-A9BC-83E78D4ABC5B&displaylang=en

最后是一些.Net Framework 2.0 Beta1的一些Code Samples:
http://www.microsoft.com/downloads/details.aspx?familyid=c3c41e75-f8a8-4077-84cf-e43176d93b1e&displaylang=en

另外,大家都知道,MS已经决定让Avalon和Indigo能运行在WinXP和Win2003上了,并且在Longhorn的发行版本中去掉了WinFS(以后以类似Add-on的形式提供)。我在网上见得最多的问题就是:既然Avalon和Indigo已经可以在WinXP上使用了,而Longhorn里面又没有了WinFS,那我们还有什么理由非将自己的WinXP升级到Longhorn呢?嗯,真是有意思的问题…

 

Posted by on 2004/08/31 in 未分类

13 Comments

Tags:

SOA & Messaging Patterns

在上期的《程序员》杂志上,记得有一篇板桥里人写的Java相关的开篇,文章里面讲到,SOA is NOT Web Services。

William Zentmayer在一篇Blog《Doing SOA without Web Services? I’m skeptical.》中表达了自己的观点,那就是虽然很多人都认为SOA并不就意味着Web Services,但是离开了Web Services的SOA几乎没有“价值”可言。这篇文章后面的留言对作者的观点进行了“无情的”驳斥,留言者都认为SOA是比Web Services更为广泛的概念,在以往(甚至先于Web Services的出现)的被开发出的系统之中,就已经可以看到SOA的存在了。在作者随后的《Doing SOA without Web Services? Part II》中,他虽然为自己先前的观点进行了辩护(理由是,如果考虑SOA必须要满足异构系统间的通讯,就必须使用一种业界公认的标准协议来进行通讯,即SOAP和Web Services),但还是接受了SOA更加倾向于是一种Messaging System的观点。

MSDN上有一篇很棒的文章,《Messaging Patterns in Service-Oriented Architecture, Part 1》,介绍了SOA中出现的各种Messaging Patterns。比如,Messaging System很自然被理解成传递Message的系统,那么在这个系统中如何实现用Messaging Patterns调用远程系统的一个方法呢?答案就是“Command Message Type Pattern”。

另外,对于上面这个问题,九月份的MSDN Magzine上面的一篇《Simplify Distributed System Design Using the Command Pattern, MSMQ, and .NET》也是属于极力推荐的文章。

 

Posted by on 2004/08/21 in 未分类

4 Comments

Tags:

Delphi9的一些信息

Borland Conference 2004下月即将在加州圣何塞开幕,在BorCon04上,预计将有大量关于Delphi9的信息被“爆出”。

Borland一直希望自己能在.NET开发平台领域占有一席之地,可惜Delphi8只能用“半成品”来形容,几乎没有吸引到太多的.NET开发人员,也造成了大量的Delphi Win32的开发人员仍然停留在Delphi5、6、7版本上,对是否进入.NET平台而犹豫不决。另外的那个C# Builder也是反映平平,毕竟C#程序员很少会不直接使用VC#的。

现在Borland对Delphi9充满了信心,相信它会是一个“跨时代”的产品。下面是我从Borland站点Borland员工的Blog李维的论坛上所获得的一些关于Delphi9的信息:

1、D9的CodeName叫做“Diamandback”。
2、D9基于.Net Fx 1.1,预计将在今年年底正式推出,现在D9处于Beta1阶段。根据李维的说法,这个Beta1版本的稳定性非常好,甚至好过D8 SP3!!(从侧面证明了D8的稳定性的确是差…)
3、D9同时支持.NET平台和Win32平台的程序开发,并同时支持Delphi、C#、VB.NET语言。D9可以自动的对Win32的程序生成相应的Wrapper,以让.NET程序可以直接调用。就是说,一个大的解决方案可能包括一个Delphi Win32 dll项目、一个C# .Net dll项目,一个Delphi .Net WinForms项目…
4、D9内置了单元测试、建模、重构工具,看起来很强。
5、对ECO(Enterprise Core Object)进行了加强,可以支持ASP.NET项目了。我一直认为ECO是D8(和C#Builder)里面最有价值、最Cool的东东!如果ECO可以单独提取出来,在VS.NET中间使用就好了…

如果D9果真能够达到Borland所承诺的那样,具有强大功能(和VS2003比)的同时,具有很好的稳定性,那么D9的确将会是一个值得期待的开发平台。即使从对Object Pascal语言不感兴趣的.NET程序员的角度,在D9里面使用C#进行开发也令人很有兴趣。:)

 

Posted by on 2004/08/18 in 未分类

23 Comments

Tags:

将ViewState保存到其他地方

前两天做了一个小东西,包装了一下ViewState的存储,实现将页面的ViewState保存到我们指定的地点。关于ViewState的原理已经如何进行这样的修改,可以参看以前我的一篇Blog上面的内容。

Kaneboy.Web.ViewState内置了三种存储ViewState的方式,保存在Session中、压缩后保存在页面上的Hidden Field中,以及按照ASP.NET 1.1所实现的那样,直接保存在Hidden Field中。通过查看其源码,你可以更深入的了解ViewState的知识。

根据我的使用试验,在有DataGrid或类似控件的页面上,使用内置的ViewState压缩方式就可以大大的缩小页面的体积。

详细的使用说明在这里,通过阅读说明,你就可以大致了解它。源码在这里

 

Posted by on 2004/08/16 in 未分类

7 Comments

Tags:

Kaneboy.Web.ViewState使用说明

Kaneboy.Web.ViewState使用说明

(一)概述

Kaneboy.Web.ViewState提供了以多种方式保存ViewState的能力。ASP.NET引擎默认是将ViewState作为页面上一个Hidden Field保存到页面上,但使用Kaneboy.Web.ViewState,我们可以改变ViewState的保存方式。

(二)使用步骤说明:

1、将Kaneboy.Web.ViewState的所有三个dll文件拷贝到正确的Web程序的/bin目录中。

2、修改web.config,在其中增加如下所示的配置节:

<configuration>

 <configSections>
  <section name=”viewStateManagement” type=”Kaneboy.Web.ViewState.ViewStateManagementConfig, Kaneboy.Web.ViewState” />
 </configSections>
 
 <viewStateManagement>
  <handler mode=”on” type=”Kaneboy.Web.ViewState.SessionViewStateHandler, Kaneboy.Web.ViewState” />
 </viewStateManagement>

</configuration>

其中<viewStateManagement>节点下的<Handler>节点用来指示使用哪种方式来保存ViewState,以及是否启用自定制的ViewState保存方式。

3、接管页面上默认的ViewState保存方式。你可以选择下面的两种方法之一:

(1)将要改变ViewState保存方式的页面的父类从默认的System.Web.UI.Page改为Kaneboy.Web.ViewState.ViewStatePageBase。

通常一个好的Web程序设计会让系统中所有的页面继承自一个自定义公共基页面类(而不是继承自默认的System.Web.UI.Page),以实现某些自定制的功能(比如所有页面错误的捕捉等等),如果有这样的设计,那么您只需要将这个自定义的公共基页面类继承自Kaneboy.Web.ViewState.ViewStatePageBase即可。

(2)在页面的代码中,override下面所示的两个方法:

protected override void SavePageStateToPersistenceMedium(object viewState)
{
 Kaneboy.Web.ViewState.ViewStateManagement.SaveViewState(this, viewState);
}

protected override object LoadPageStateFromPersistenceMedium()
{
 return Kaneboy.Web.ViewState.ViewStateManagement.LoadViewState(this);
}

(三)可以使用的ViewState保存方式

在上面提到的配置文件中<viewStateManagement>节点下的<Handler>节点的type属性用来指定使用哪种方法来保存ViewState,可以选择的方法包括:

(1) type=”Kaneboy.Web.ViewState.CompressedHiddenFieldViewStateHandler, Kaneboy.Web.ViewState”

将ViewState压缩后保存到页面的一个Hidden Field中。

(2) type=”Kaneboy.Web.ViewState.SessionViewStateHandler, Kaneboy.Web.ViewState”

将ViewState保存在服务器的Session中。

(3) type=”Kaneboy.Web.ViewState.AspNet1_1ViewStateHandler, Kaneboy.Web.ViewState”

系统默认的ViewState保存方式,即将ViewState保存在一个名字为“__VIEWSTATE”的Hidden Field中。不推荐使用这个方法。

(四)如何扩展自定制的ViewState保存方法

通过继承Kaneboy.Web.ViewState.ViewStateHandlerBase,并重写其SaveViewState和LoadViewState方法即可,这两个方法分别用来保存ViewState和载入ViewState。

 

Posted by on 2004/08/16 in 未分类

1 Comment

唾手可得的宝藏:Mono源码

“源码是最好的文档”,有了源码,任何软件系统在开发人员面前就毫无“神秘”可言了…

今天需要做一个上传文件的Web页面,在调用HttpPostedFile.SaveAs(String filename)方法将文件写到服务器磁盘上时,想到如果此文件已经存在于磁盘上,这个方法会如何处理呢?直接覆盖?抛出异常?

翻一下.NET Framework文档,可惜里面没有对这个情况进行说明。于是进入Mono源码目录,定位到HttpPostedFile.cs文件,用记事本打开,找到SaveAs(String filename)方法,第一句就是:

FileStream File = new FileStream(filename, FileMode.Create);

OK,确切答案就是如果已经存在同名文件会直接覆写。

我猜一定有人会想,“万一Mono的实现和.Net Framework不同怎么办?”其实我过后就这么想了,于是用Reflector打开了System.Web.dll,定位这个方法,呵呵,.Net Framework的实现也是“FileMode.Create”。不过.Net Framework使用了一个try…catch来保证关闭这个FileStream,而Mono的实现里面则没有,嗯,这是不是意味着Mono的稳定性仍有不少改进之处呢?

 

Posted by on 2004/08/10 in 未分类

11 Comments

Tags:

如何判断Assembly是Debug还是Release?

在拿到一个Assembly文件(.dll、.exe)的时候,如何才能迅速判断这个文件是使用Debug模式还是Release模式编译出来的呢?

在项目的AssemblyInfo.cs文件中,使用这样一个技巧:

#if DEBUG
[assembly: AssemblyDescription(“Debug”)]
#else
[assembly: AssemblyDescription(“Release”)]
#endif

编译出来Assembly文件以后,只要直接察看文件的属性,就可以看出来了:

如果要在程序中取得这个信息,可以使用:

Object[] attrs = System.Reflection.Assembly.GetExecutingAssembly().
    GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
if (attrs.Length > 0)
{
    String sCompMode = (attrs[0] as AssemblyDescriptionAttribute).Description;
}

来得到这个信息。

Source : http://weblogs.asp.net/tgraham/archive/2004/06/16/157545.aspx

补充:Lostinet说出可以使用“System.Diagnostics.DebuggableAttribute”这个Attribute来判断一个Assembly是否是Debug模式编译的。但是,在这里C# 1.1编译器有一个“Bug”:

不管当前的Assembly是否是Debug模式编译的,C# 1.1的编译器csc.exe都会给Assembly加上“System.Diagnostics.DebuggableAttribute”,而指定“/optimize”参数时,csc.exe才不加。就是说,我们即使不启用Debug来进行编译:

“csc some.cs /debug-”,也会给编译出来的Assembly加上DebuggableAttribute;

“csc some.cs /debug- /optimize”,这样才不会加上DebuggableAttribute。

但是,幸运的是,VS.NET开发环境只要是Release模式编译,都会自动给csc.exe加上“/optimize”参数,所以…从这点上来讲,只要Assembly是在VS.NET里面编译的,这个方法还是有效的。

 

Posted by on 2004/08/09 in 未分类

17 Comments

Tags:

Enterprise Development Reference Architecture(ShadowFax)

Enterprise Development Reference Architecture(EDRA),也就是以前的ShadowFax,在6月份已经发布了正式的1.0版本,现在项目正处在1.1的开发阶段(已经发布了一个1.1测试版本)。

嗯,先解释一下Enterprise Development Application Framework,EDAF是这个项目提供的一个企业级开发平台和框架,开发人员可以基于EDAF来进行企业级应用的开发。EDRA则是对使用EDAF进行开发的一个参考、描述、规范…

先看看EDRA的Architecture Overview图片:

EDRA可以算是非常典型的SOA架构。可以看到图上被分为了两大块,Service Interface和Service Implementation,根据名字我们就能够大致猜出它们各自的作用和地位。在实际的应用中,我们通常可以将Interface和Implementation部署到不同的Tier,以获得更好的扩展性。我们根据这张图来从上往下的走一遍吧。:)

首先,Client App发出一个Request给Service Interface,这个Request可以是多种协议的,WebServices、MSMQ、Remoting,每种协议都对应一个Interface Transport,Transport负责接受Request,并传递给各自对应的Adapter。

Adapter对于Request可以做出一些初始化的处理,比如安全验证什么的,然后,Adapter会创建一个Context对象,将这个Request放在Context对象里面,然后将Context对象传递给Service Interface里面的Pipeline。

Pipeline是一个配置性很高的组件,它根据配置文件,来载入各种Handler,包含了Request内容的Context对象就依次被这些载入了的Hander处理、传递,并最终到达一个Interface Pipeline Target,这个Pipeline Target是一个Dispatching Target,它可以根据配置,使用不同的协议将Context传递给Service Implement部分(Web Service、MSMQ、DCOM、或者Inproc直接调用)。

Context首先到达的也是Service Implement部分的Dispatching Transport(类似Service Implement,也有多种Transport来接收多种协议的请求),每个Transport同样有一个Adapter,然后Adapter创建出Pipeline,将Context传进去。Context在Service Implementation的Pipeline里面做得事情和前面差不多。最终,Context到达了一个Business Action Target,这个Target负责调用“真正”的Business Action。

Business Action根据包含在Context中的Request执行相应的操作,然后生成一个Response,将这个Response放进Context里面,然后将Context返回给Business Action Target。

Context对象沿着来时的路线又一路返回,返回的路上也可能被经过的各个Handler进行一些处理,最后,Context返回到了创建它的Interface Transport Adapter。

Adapter这时需要查看Context中是否包含了异常信息,并分辨异常信息是属于业务逻辑执行上的异常还是EDAF本身所产生的系统异常,如果是前者,将被直接返回给Client App,如果是后者,则进行一些Log或者其他操作后,返回一个包装好的安全的错误信息给Client App。

在EDRA的主页上,同时还提供了一个Global Bank Reference Implementation,使用EDRA来构建的一个银行系统的示范项目。EDRA Wiki上也有不少有意思的内容。

最后,如果对这样的架构和框架感兴趣,那么还可以去看看微软的另外一个项目:FABRIQ,FABRIQ是一个高性能的的、单向的、基于队列的一个Messaging Architecture实现。

 

Posted by on 2004/08/08 in 未分类

评论关闭

Tags: ,

自己实现的一个Script Callback

昨天网上一位朋友推荐我看了一篇文章《Remote Scripting in .NET》,这篇文章的作者利用了Microsoft Remote Scripting技术,在服务器端进行了一些封装,方便了在ASP.NET中的页面上调用直接调用服务器端方法。

说起来我以前对Microsoft Remote Scripting还是挺陌生的,MRS的原理是利用了内置的一个Java Applet,通过一些高层的封装,使页面上使用Script能够直接调用服务器上公开的方法。感兴趣的朋友可以看看MSDN上的文档,用起来还算是方便,特别是配合前面那篇文章作者做的那个封装的.NET组件

不过我个人对Applet并不是很感冒,特别是在我家里的那台没有安装JRE的WinXP SP2RC2的机器上更是根本没法用…

其实我最喜欢的还是ASP.NET 2.0中的Script Callback那样的实现方式,简单、明了,于是想到,既然它也是底下使用XMLHTTP来实现的,那不如我自己在ASP.NET 1.1下面也照样用XMLHTTP实现一个好了。花费了一阵功夫,大功告成。大部分都是仿造的ASP.NET 2.0中的实现方式,但是部分地方还是不能做到完全一样,因为对于实现ICallbackEventHandler接口的控件的处理,我没法直接写到Page类或更里面的地方,所以需要在页面里面创建一个ScriptCallbackManager的控件。

服务器端的进行步骤:
1、让页面上的某个控件实现ICallbackEventHandler接口,我个人喜欢就让Page类直接实现;
2、在实现了ICallbackEventHandler接口的控件上实
现RaiseCallbackEvent方法,来处理客户端的请求;
3、在页面中加入一个ScriptCallbackManager控件,在构造函数中指明实现了ICallbackEventHandler接口的控件,和调用完成后执行客户端的Script函数名。

public class WebForm1 : System.Web.UI.Page, ICallbackEventHandler
{
    private void Page_Load(object sender, System.EventArgs e)
    {
        this.Controls.Add(new ScriptCallbackManager(this, “handleResultFromServer”));
    }

    public String RaiseCallbackEvent(String eventArgument)
    {
        return “You sent ” + eventArgument + ” !”;
    }

页面上的进行步骤:
1、在需要调用服务器方法的地方直接调用内置的scriptCallback()函数,第一个参数指定了要传递到服务器端的变量,第二个参数指定了此次请求的上下文;
2、编写一个在完成调用之后自动执行的函数,这个函数的名称需要和服务器端ScriptCallbackManager控件的构造函数中指定的函数名称相同。

function callBack()
{
    var param = document.all.txtRequest.value;
    var context = “”;
   
    scriptCallback(param, context);
}

function handleResultFromServer(result, context)
{
    alert(result);
}

在callBack()方法中调用了系统内置的一个Script函数scriptCallBack(),这个函数会自动调用服务器方法,并将第一个参数的值传给服务器端的RaiseCallbackEvent()方法的参数。handleResultFromServer是在调用完成后自动执行的函数。

感兴趣的朋友可以在这里下载到这个Script Callback实现的项目源码。

 

Posted by on 2004/08/02 in 未分类

16 Comments

Tags: