开拓者

不欲闻达,但求自乐

2008年9月3日 #

在ie直接打开word/excel文件(转贴)

有朋友询问如何在Web页面上做到像SharePoint中的效果一样,能直接激活客户端的Word来打开.doc文件,而不是类似直接点击.doc文档链接时Word在IE中被打开那样。想想这个问题应该很多人都会感兴趣,所以干脆写一篇blog来大致描述一下方法。

在安装Office2003以后,有一个ActiveX控件被安装到了系统中,这个控件位于“Program Files\Microsoft Office\OFFICE11\owssupp.dll”。通过这个控件,客户端页面上的JavaScript就可以激活本地的Office软件,来实现打开、编辑Office文档。(另,Office XP应该就已经包含这个ActiveX控件了。)

首先,用Script创建一个本地的对象:

openDocObj = new ActiveXObject("SharePoint.OpenDocuments.2"); // 为了兼容Office XP,可以创建“SharePoint.OpenDocuments.1”

然后,调用openDocObj的相应的方法。比如打开服务器上的一个Office文档:

openDocObj.ViewDocument("http://www.abc.com/documents/sample.doc");

openDocObj对象会根据参数中不同的Office文档类型(.doc、.xls、.ppt)来打开不同的程序(Word、Excel、PowerPoint)。ViewDocument()方法还有一个重载签名,可以让我们手工指定激活哪个程序来打开文档:

openDocObj.ViewDocument("http://www.abc.com/documents/sample.doc", 要激活的程序的ProgID);

那么要打开Office程序在线编辑文件又如何?

openDocObj.EditDocument("http://www.abc.com/documents/sample.doc");

就可以直接激活Word,在Word里面编辑文档,然后直接点击Word里面的保存功能,就可以将文件保存会服务器上了。注意:为了让Word能将编辑后的文档直接保存会服务器,访问Web站点的当前上下文的Windows Identity必须对服务器的相应目录(即“http://www.abc.com/documents”这个虚拟目录所对应的服务器上的物理路径)有相应的写权限,否则保存动作会失败。编辑完成后,EditDocument()会返回一个bool值,来反映编辑操作是否成功。

我们还可以通过打开服务器上的一个文档模版,来创建一个新的文档:

openDocObj.CreateNewDocument("http://www.abc.com/documents/sampleTemplate.dot", "http://www.abc.com/documents/");

就可以使用“http://www.abc.com/documents/sampleTemplate.dot”这个模版来创建一个新的文档,默认新文档的保存地点是“http://www.abc.com/documents/”。创建新文档时使用的程序取决于模版文件的类型(比如.dot模版会对应Word)。新文档的保存同样需要注意权限问题。CreateNewDocument()方法同样会返回一个bool值来反映操作是否成功。

CreateNewDocument()方法的第一个参数,除了可以使用一个模版的地址外,还可以直接指定为希望用来创建新文档的客户端程序的ProgID。

posted @ 2008-09-03 15:47 大鱼 阅读(9) | 评论 (0)编辑

2008年8月31日 #

动态创建对象

郁闷,听某某程序员大吹特吹反射的好处。问了下他怎么实现对象的动态创建,对方竟然一无所知。

回宿舍后找了相关动态创建对象的方法,还是没找到什么好的实现方法。使用老办法。如下:  

      Class1 asm = Assembly.Load("TestDLL").CreateInstance("TestDLL.Class1") as Class1;

        Type t = Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,   Culture=neutral,   PublicKeyToken=b77a5c561934e089");


 

后建创建一简单动态对象工厂:

    public static T ObjectFactory<T>(string assemblyName,string typeName) where T : class
    {
        return Assembly.Load(assemblyName).CreateInstance(typeName) as T;
    }

 

调用:Class1 class1 = ObjectFactory<Class1>("TestDLL", "TestDLL.Class1");

 

另:在反射功能的测试过程中发现,ASP.NET生成后,站点页面和站点中类所在的程序集是不一样的。

 

类似这样的GetType方法是不行的。

 Type tt = Type.GetType("System.Data.DataTable");

 

 Activator.CreateInstance("TestDLL","TestDLL.Class1")

posted @ 2008-08-31 11:04 大鱼 阅读(160) | 评论 (0)编辑

2008年8月13日 #

Build Google IG like Ajax Start Page in 7 days using ASP.NET Ajax and .NET 3.0

     摘要: 07年兄弟潘推荐的一文章。至今重看。味道依旧。 Download source code - 841.1 Kb Download latest source code IntroductionI will show you how I built a start page similar to Google IG in 7 nights using ASP.Net Ajax, .NET 3.0, ... 阅读全文

posted @ 2008-08-13 16:44 大鱼 阅读(9) | 评论 (0)编辑

2008年8月5日 #

图片处理转换

     摘要: 1. 引言彩色图象是多光谱图象的一种特殊情况,对应于人类视觉的三基色即红、绿、蓝三个波段,是对人眼的光谱量化性质的近似。三基色模型是建立图象成像、显示、打印等设备的基础,具有十分重要的作用。在第二章中,已经就彩色做了基本介绍,例如各种彩色空间的表示、定量关系,彩色立方体等直观的图示,参见:(第二章 图象获取、显示、表示与处理)图象显示部分,这里不再重复。 有关彩色的资料参见:efg's Color... 阅读全文

posted @ 2008-08-05 16:53 大鱼 阅读(9) | 评论 (0)编辑

2008年6月20日 #

更改信息分类存储过程

-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,将某类型信息拷贝到指定定的类型中,>
-- =============================================
CREATE PROCEDURE NewsCopyByTpye
 --
    @OldTypeID varchar(50),
    @OldCategaryID varchar(50),
    @NewTypeID varchar(50),
    @NewCategaryID varchar(50)
AS
BEGIN
 begin transaction   
  select * into #TempNews from dbo.tbNews  where NewsKindID =@OldTypeID and CategaryID = @OldCategaryID
  
        update #TempNews set NewsKindID =@NewTypeID,CategaryID = @NewCategaryID
  
        insert into dbo.tbNews(NewsID,NewsKindID,UserID,CategaryID,Title,NewsContent,UpdateTime,State,NewsFrom,NewsUrl,IsShow,CssStyle,AuditComment) select NewID(),
  NewsKindID,UserID,CategaryID,Title,NewsContent,UpdateTime,State,NewsFrom,NewsUrl,IsShow,CssStyle,AuditComment from #TempNews
  
  drop table #TempNews
  commit transaction
     return 1
  rollback transaction
     return 2
    END
GO

posted @ 2008-06-20 13:27 大鱼 阅读(23) | 评论 (0)编辑

2008年6月17日 #

Biztalk中使用SQL适配器获取数据并用web服务发布的例子

参照文章:http://www.cnblogs.com/chnking/archive/2006/06/23/434193.html 制作的例子。 代码下载
运行测试代码时,报错“SOAP内部处理失败”
问题的解决:
 一. 项目描述
  使用biztalk2006在vs2005开发环境中做一个简单的测试业务流程,主要是测试使用biztalk发布一个web services,这个web services接受用户发送的请求,然后根据用户要求通过sql adapter到sql server数据库中提取相关数据,最后作为web services的response返回给用户。
  业务流程如下:
  
  
  图中,Port_2是双向接收端口,就是这个端口需要发布为web services,Port_1是一个用sql adapter向导做的双向发送端口,使用的是存储过程,参数只有一个Rows,指示需要获取的数据行数,存储过程返回Rows要求行数的数据。
  相应的Schema也很简单:
  
  
  Biztalk项目做好后,编译,部署,一切顺利。
  在biztalk管理器中,在这个应用程序中添加物理发送端口,指向相应的数据库连接,指定返回的Schema类型,绑定了Port_1逻辑端口。
  最后用biztalk web services发布向导做Port_2端口的web services的发布设置。按照向导的指示一步步的做,其中有一步需要选择是否将此web services指定给某个应用程序的接收位置,在这里选择作为本应用程序的接收位置,这样就将要生成的web services跟Port_2端口进行了绑定。
  在biztalk管理器中启动这个应用程序,启动正常。
  二. 问题现象
  建立一个winform的应用,引用上面过程中发布的web services,引用后在项目中生成这个web services代理类,拥有一个叫做Operation_1的方法,这个方法就是Port_2端口定义的操作名。
  在界面上放置一个button,在这个button的点击事件中,新建一个web services代理类的实例,新建一个Operation_1方法的参数的实例,之后调用Operation_1方法,接收Operation_1方法的返回值。
  以上是测试场景,调用Operation_1方法的代码处设置一个断点,调试执行这个winform应用程序,点击button,程序在调用Operation_1方法处遇到断点中断,这时进行单步调试,程序执行调用Operation_1方法,实际就是调用web services的操作,结果返回一个错误:SOAP内部处理失败(SoapException: Internal SOAP Processing Failure)。同时在事件查看器中有以下的错误提示:
  l 用户'NT AUTHORITY\NETWORK SERVICE' 登录失败。
  l 试图连接到服务器“JINJZ2003”上的“BizTalkMgmtDb”SQL Server 数据库失败。错误:“无法打开登录所请求的数据库"BizTalkMgmtDb"。登录失败。”
  (An attempt to connect to "BizTalkMgmtDb" SQL Server database on server "Server" failed with error: "Cannot open database requested in login 'BizTalkMgmtDb'. Login fails.".)
  l 消息引擎无法注册接收位置“/BiztalkSqlSP_Proxy/BiztalkSqlSP_Orchestration_1_Port_2.asmx”的“SOAP”的适配器。请验证接收位置存在,且独立的适配器在可以访问BizTalk 数据库的帐户下运行。
  (The Messaging Engine failed to register the adapter for "SOAP" for the receive location "/VirtualDirectory/Name.asmx". Please verify that the receive location is valid, and that the isolated adapter runs under an account that has access to the BizTalk databases.)
  三. 解决过程
  根据错误提示,到微软的支持网站查询,果然有这个错误的相关说明和处理方法,是因为web services对应的应用程序池的帐户不是BizTalk Isolated Host Users组的成员。BizTalk Isolated Host Users组具有对'BizTalkMgmtDb'数据库的访问权限。同时这个帐户也必须是IIS_WPG组的成员。
  查看了IIS中这个web services对应的应用程序池是DefaultAppPool,DefaultAppPool对应的帐户是网络服务(network service),在IIS_WPG组中有network service帐户,可是在BizTalk Isolated Host Users组中没有network service帐户,于是在BizTalk Isolated Host Users组中加入network service帐户。测试,故障依旧,在事件查看器中依然有错误提示:network service无法登录'BizTalkMgmtDb'数据库。真是有点奇怪。
  将DefaultAppPool对应的帐户改为“IWAM_机器名”,同时也把“IWAM_机器名”加入到BizTalk Isolated Host Users组和在IIS_WPG组,然后重新启动IIS,再进行测试。依然有错误,不过这次错误提示不是原来的“SoapException: Internal SOAP Processing Failure”,改成了“System.Web.Services.Protocols.SoapException: 服务器无法处理请求。---> System.InvalidOperationException: 无法生成临时类(result=1)。\nerror CS2001: 未能找到源文件“C:\\WINDOWS\\TEMP\\zyobqxbr.0.cs()”
  看来数据库访问权限的问题解决了,查看事件查看器也没有了数据访问的错误记录。就新产生的错误去查微软支持网站,找到相关内容,说web services对应的应用程序池的帐户需要对%systemroot%\Temp文件夹有读写权限,因为Web service (.asmx)文件的JIT会在%systemroot%\Temp文件夹编译生成DLL文件,如果应用程序池的帐户没有%systemroot%\Temp文件夹的读写权,就不能生成相关的dll文件。
  按此说明,设置给“IWAM_机器名”帐户读写%systemroot%\Temp文件夹的读写权,再测试,OK,成功,Operation_1方法成功的返回的预期的结果。
  参考文档:
  1. BizTalk Server 2004 和Web 服务:http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/BTS2004WP5cab05ab.mspx?mfr=true
  2. You cannot call an orchestration that is exposed as a Web service on a server that is running BizTalk Server 2004:http://support.microsoft.com/?kbid=910295

posted @ 2008-06-17 13:28 大鱼 阅读(5) | 评论 (0)编辑

2008年6月4日 #

企业应用程序集成 -- biztalk帮助手册的教程

下午抽空看了BIZTALK的帮助文档。按照其中的教程做了一下样例,发现还比较顺利。
准备这段时间,认真,系统的研究一下BIZTALK技术。

企业用用程序集成代码如下:slbt.rar

posted @ 2008-06-04 16:47 大鱼 阅读(24) | 评论 (0)编辑

2008年5月30日 #

IIS的各种身份验证详细测试

     摘要: 一、 IIS的身份验证概述1、 匿名访问2、 集成windows身份验证2.1. NTLM验证2.2. Kerberos验证3、 基本身份验证二、 匿名访问三、 Windows集成验证1、 NTLM验证过程1.1. 客户端选择NTLM方式1.2. 服务端返回质询码1.3. 客户端加密质询码再次发送请求1.4. 服务端验证客户端用户和密码2、 Kerberos验证过程2.1. 客户端选择Kerber... 阅读全文

posted @ 2008-05-30 14:36 大鱼 阅读(23) | 评论 (0)编辑

应用程序向IIS传送身份验证

     摘要: 一、 匿名访问........................................................................................................................ 11、 客户端发送一个匿名的http请求....................................................... 阅读全文

posted @ 2008-05-30 14:35 大鱼 阅读(15) | 评论 (0)编辑

2008年5月28日 #

无法卸载和配置SHAREPOINT

对使用的MOSS系统打了一个补丁,在打补丁过程中显示失败。
查看了系统日志,如下:

配置 SharePoint 产品和技术失败。为使此产品正确运行,必须执行配置。若要诊断该问题,请检查 C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\LOGS\PSCDiagnostics_5_28_2008_9_42_40_810_12393629.log 中更为详细的错误信息,解决该问题,然后再次运行此配置向导。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。

未能初始化 SharePoint 产品和技术升级。
已引发类型为 Microsoft.SharePoint.PostSetupConfiguration.PostSetupConfigurationTaskException 的异常。其他异常信息: initialize 命令无效或遇到错误。
无法升级 SharePoint 产品和技术,因为已在进行一项升级。可以使用管理中心 Web 应用程序监控升级进度,或者监控服务器 BC-INTAPPSRV 上的升级日志。

解决办法:
进入MOSO管理中心:管理中心 > 操作 > 计时器作业定义
将系统升级的计时器删除

重新删除MOSS系统,一切正常。

posted @ 2008-05-28 10:12 大鱼 阅读(17) | 评论 (0)编辑