SharePoint Portal Server & Office Research Service

自从得知Kaneboy兄编写了一个基于SPS的信息检索服务之后,就在大功完成的时候,看了一眼SPS的SDK,却发现这东西其实本来就已经有了。看来我又犯了“想当然”的错误。

在开发之前,我一直想寻找SPS是否具有这个功能,但是在看完Kaneboy的文章后,我想当然的以为这东西需要自己开发,于是摩拳擦掌,开始写代码进行实现。中间还遇到种种的问题,分别向moslem以及kaneboy进行了求教。

不过虽然SPS原来就有这种功能,但通过这几天的摸索,还是了解了很多原来不了解的知识,如在SPS上如何开发部署自己的Web Service等等。

大体来说有以下几步:

(1)在Web站点的属性中新增加一个MIME类型,即“.tmp”,并且将其对应到“common/type”;

(2)新建一个Web Service项目。注意,其所选的路径应该为http://portalServer/_layouts/ProjectName。(我是新建了一个虚拟目录,并且在SPS管理中心将其设为排除的路径);

(3)增加Microsoft.SharePoint.dll的引用,然后开始开发其功能;

(4)开发完毕后,将其部署到[driver name]:\Program Files\Common Files\Microsoft Shared\web server extensions\60\ISAPI当中,并且可以使用http://portalserver/_vti_bin/[Name].asmx来访问;

(5)此时使用VS.NET注册会出现HTTP错误,你应该使用命令行工具咧嘴笑脸isco http://portalserver/_vti_bin/[name].asmx来建立一个disco以及wsdl文件,并且按照SDK中的描述对其进行修改及重命名,再部署过来。

恶魔的脸现在就可以像普通的Web Service进行访问了。

另外,SPS自带的信息检索功能其实就在http://portalserver/_vti_bin/search.asmx中,大家可以试一下笑脸

VS.NET Option|选项 系列谈(2)

当一个项目的源程序在VS.NET外部被修改了,我们熟悉的这个对话框就会出现了:

在很多情况下,我选择“Yes to All”. 但是在工作中有些时候会多次出现这种情况(如同时打开2个VS.NET,一个用来编辑和编译,另外一个用来Debug。在有的情况下需要这样做),如何能不被提示,而直接Reload所有修改过的文件呢?

答案就是:Environment–>Document–>选中Auto-load changes (if not currently modified inside the environment).如下图所示:

贴子以”现状”提供且没有任何担保也没有授予任何权利。

从自己做起 (这篇除外)

最近一直在读一些非技术的文章/书籍,所以blog了不少跟技术无关的东西。原来也想分开过,但感觉麻烦。现在下了决心,决定一分为二。这里主要是写跟技术有关的东西,如果有人对我的生活/学习/个人爱好/胡言乱语感兴趣的话,可以去博客.CN看看

XmlSerializer

在最近的一个ASP.NET项目中,菜单是动态产生的。但客户要求能随时改动这菜单,虽然这样的改动不是经常性的,但他们需要有这样的灵活性。我们不指望,也不希望他们直接修改数据库,也没打算另设一个专门界面供他们修改菜单数据,所以我们把菜单数据放在了一个XML文件里。如果他们需要改动菜单的话,管理页面的人只要修改这XML文件即可。

考虑到性能问题,我们将该文件里的数据做了缓存,并且对该缓存建立了对那XML文件的依赖性。如果那个XML文件被改动的话,我们重新装载数据。在程序中,通过XmlSerializer从该缓存中的数据来生成对象,做个人化的处理后,进一步生成菜单。测试运行时,甚至做压力测试时一直很可靠。

项目正式推出后,一开始没问题,能承受的共时用户数也满足要求。突然有一天,网站不能访问了,但能登陆那台网络服务器的机器。关闭aspnet_wp.exe进程或重启网络服务器后,网站又能正常运行,但过几天后,同样的问题又会发生。我们是用微软的Exception Management Application Block来记录Exception的,问题发生时,我们发现在Event Viewer Application Log里有类似这样的一个记录,

…..Cannot execute a program. The command being executed was “c:\winnt\microsoft.net\framework\v1.1.4322\csc.exe” /noconfig @”C:\WINNT\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\OurAppName\8f217464\4023a27\npbqe25u.cmdline”.]
System.CodeDom.Compiler.Executor.ExecWaitWithCaptureUnimpersonated(IntPtr userToken, String cmd, String currentDir, TempFileCollection tempFiles, String& outputName, String& errorName, String trueCmdLine) +2036
…..

后面还有一堆别的Exception记录,但看样子都是这个Exception的衍生物。

What the heck is this? 我们的项目是用VB.NET写的,怎么会跟csc.exe有关?Google了一下,在微软的KB里发现这篇文章

BUG: “ExternalException: Cannot Execute a Program” Error Message When You Call WebServices from .aspx Page

跟WebServices有关?我们没用WebServices啊

再查,有个人也有类似问题,

Cannot execute a program. The command being executed … Error

据说跟IIS Lockdown tool有关。但我们是内部网络,也没有用IIS Lockdown tool啊。根据上述KB文章的建议,我们给予IUSR_机器名 以及 IWAM_机器名充分的权限,问题依旧。

最后向微软支持中心求救,他们的解释是,每次生成带有XmlAttributeOverrides属性或类参数的XmlSerializer对象时, C#编译器就会被调用,导致memory增加,时间长了,就会产生上述问题。他们建议在Application对象里缓存一个XmlSerializer对象,在以后的调用中重用该XmlSerializer对象,sounds like an ugly solution to me

那部分使用XmlSerializer对象的编码是项目早期就完成的,没想到会造成这样的问题。一气之下,用另外的方法重写了菜单类,问题解决。

Image Server Courtesy of Julien | 感谢Julien提供服务器

As you can see, my blog now contains images. It is made possible with great help from Julien Ellie. Julien, as well as his girl friend, is working at Microsoft . For more information about this great guy, check out his introduction.

如前所见, 我的博客现在包括图像了. 这是因为Julien Ellie的大力帮助才成为可能. Julien和他的女友都在微软工作. 关于这个年轻人的更多信息,请看他的 自我介绍.

现在我应该用法语重复一下前面的段落,只是我不会法语。。。
Now I should start writing in French. The only problem? I could not speak that language…

VS.NET Option|选项 系列谈(1)

通过VS.NET的Tools菜单,选择Option|选项,就可以看到下面的对话框:

不是所有选择的意思都是一目了然的,比如“animate environment tools”就使得微软的一位PM在名为Option Auction的blog上评论道:

  • Environment.General.Animate Environment Tools (with a great slider to adjust the speed!). What – why is this an option?
    这就促使我写这个blog了,因为我曾经花费过时间想找到这样一个选项的。而等到我发现它之后,我每次都会使用它—清除前面的checkbox。

    这个选项到底是控制什么animation|动画的呢?在下面的图里,当我们想从显示Windows Forms的控件切换到Data控件,就会移动鼠标到Data上面并单击。在默认的情况下,VS.NET会显示一个转换的动画效果。虽然看起来很美,但是在编程的时候,我希望这个转换是无延时的。

    Animate Environmet Tools 就是用于控制这里的动画效果的。

    贴子以”现状”提供且没有任何担保也没有授予任何权利。

  • Whidbey & WhiteHorse & 博客堂清理帐号

    看到大家这两天都对SOA以及Whidbey非常感兴趣,讨论得热火朝天,其实,在Visual Studio.NET的下一版(Whidbey,或者是Visual Studio.NET 2005)当中,提供了一个SOA的设计工具,即WhiteHorse。

    在PDC版本的Whidbey当中,应该没有提供WhiteHorse组件,不过现在互联网上关于这个组件透露的信息越来越多,我也找到几个相关介绍,给大家先睹为快。

    先让我们看两个截图:


    相信大家在VS.NET 2002以及VS.NET 2003当中都用过Rational XDE以及Borloand Togther或者MS Visio for VS.NET等建模工具。不过单就界面特性来说,Whitehorse更加酷,而且更加直观。

    不过如果仅仅是一个支持UML类图的建模工具,WhiteHose就似乎只是酷了一点。其实它还有更酷的特性,就是它支持MDA以及SOA的设计方式。下面是Keith Short先生所给的WhiteHorse的定义:Whitehorse is a suite of graphical design tools to be delivered in ‘Whidbey’ that supports the design and validation of service-oriented applications based on web services, and is targeted at architects, designers, developers and operations analysts. Whitehorse is an early deliverable from the Distributed Systems Initiative, aimed at improving the design, deployment and management of enterprise-class distributed applications.

    再让我们看一个WhiteHorse在SOA方面的设计截图。

    更多信息:

    关于博客堂最新更新:

    1. 博客堂最近成立了管理团队,我们通过内部管理团队对所有问题进行统一管理,管理团队大部分成员为博客堂的堂主以及部分其他人员;
    2. 为了继续维护博客堂作为精品技术社区的氛围,将于最近一段时间内对于博客堂帐号进行清理,本次将清除十余名帐号(名单基本上已经确定),由于是集体决定,不再给予申诉权力;
    3. 所清除帐号予以冻结,冻结期为一周,在一周内,如果您需要您的数据,可以与开心就好说明,我们将把您的数据以XML方式传送给您;
    4. 基于您的意愿,我们可以将您的数据平滑迁移到博客园,或者博客.CN;
    5. 博客堂仍然是一个刚起步的技术社区,我们需要您的任何建议及意见,如果您有建议或者意见,可以通过“联系”向我们提出,但任何关于申请帐号的邮件我们将不再进行回复。

    ASP.NET开发经验(2) — ASP.NET中的一些图形处理

    如果大家用过 SharePoint Portal Server 2001,一定会记得增加型文件夹中的一些很不错的特性,如文档检出/检入、发布、审批流程等,其中最吸引我的就是它通过在文档的图标上加一个特别的标记,来表示文档的状态,如下图所示:

    自己在做文档管理系统时,也借鉴了这种做法,其实和给图片加水印的作法类似,主要代码如下:

    function codedisplay()
    {
    if(document.all(“code”).style.display == “none”)
    {
    document.all(“code”).style.display = “”;
    document.all(“codeop”).innerText = “Hide Code>>”;
    }
    else
    {
    document.all(“code”).style.display = “none”;
    document.all(“codeop”).innerText = “Show Code>>”;
    }

    }

    Show Code>>

    //取源图像
    Image imgPhoto = Image.FromFile(sSourceFile);
    Bitmap bmPhoto = new Bitmap(imgPhoto.Width, imgPhoto.Height, PixelFormat.Format24bppRgb);
    bmPhoto.MakeTransparent();
    //设置绘图面属性,呈现质量等   
    Graphics grPhoto = Graphics.FromImage(bmPhoto);
    grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
    grPhoto.DrawImage( imgPhoto, new Rectangle(0, 0, imgPhoto.Width, imgPhoto.Height), 0, 0, imgPhoto.Width, mgPhoto.Height, GraphicsUnit.Pixel);

    //打开要附加的水印图片
    Image imgWatermark = new Bitmap(sWatermarkFile);
    Bitmap bmWatermark = new Bitmap(bmPhoto);
    bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
    Graphics grWatermark = Graphics.FromImage(bmWatermark);

    int xPosOfWm = imgPhoto.Width – imgWatermark.Width;
    int yPosOfWm = imgPhoto.Height – imgWatermark.Height;

    //画
    grWatermark.DrawImage(imgWatermark,
       new Rectangle(xPosOfWm,yPosOfWm,imgWatermark.Width,imgWatermark.Height),
       0,                 
       0,                  
       imgWatermark.Width,           
       imgWatermark.Height,     
       GraphicsUnit.Pixel);

    //保存最终图片
    imgPhoto = bmWatermark;
    imgPhoto.Save(sIconFileName,ImageFormat.Png);

    如果文档有审阅流程,那文档的流转图就非常受欢迎了,这样用户可以方便地查看文档正处于那个阶段。
    其实与工作流有关软件可能都有这样要求,我目前没有找到更好的办法,利用 <table> ,将各个阶段
    用线条和图形表示出来,办法虽有点笨,但好象显示效果还不错。

    曾经试过 VML ,发现要动态地画这种图,就得很精确地控制屏幕上位置,比较麻烦,后来放弃了这种作法。

    还曾经想用 Visio Automation 来试一下,发现 Visio 的对象模型和 VBA 比 Word 和 Excel 的难多了,工作量更大。

    Yukon, Whidbey 2005年正式发行

    大家一直在等待VS.NET Whidbey的发行,有人已经把它叫做Visual Studio.NET 2004了。先前发布的Develper Tools Roadmap也使用这样的日期。与VS.NET Whidbey几乎同时发行的会是SQL Server的下一代版本,代码Yukon。

    为了充分保证质量,这两个产品要等到2005年才能正式发行。见路透社的今天的报道

    所以我们将看到SQL Server 2005和Visual Studio .NET 2005. (未必是最终产品名称)