ASP 上传出问题 第一次可以上传提示70错误号 第2次成功!

mcdjxiao 2009-07-31 11:17:19
这个事客户的OA 的系统 我不懂ASP 我做服务器权限设置完了就出现这种问题了
我做服务器安全配置禁用了服务器上的 lanmanserver lanmanworkstation
Browser dhcp LmHosts helpsvc RemoteRegistry Schedule WZCSVC ShellHWDetection Themes W32Time 这些系统服务
并且禁用了
wshom.ocx
wshext.dll
shell32.dll
zipfldr.dll 组件
并删除注册表相关项
KEY_CLASSES_ROOT\WScript.Shell /f
HKEY_CLASSES_ROOT\WScript.Shell.1
HKEY_CLASSES_ROOT\Shell.application
HKEY_CLASSES_ROOT\Shell.application.1
HKEY_CLASSES_ROOT\WSCRIPT.NETWORK
HKEY_CLASSES_ROOT\WSCRIPT.NETWORK.1
起初FSO被我也禁用了导致程序直接运行不起来 后来我又弄上了
注册表权限 我已经给了 EVERYONE 权限 可使当实现上传功能却曝出 70错误号 上传不成功 而第二次却上传正常 这是为什么急
70 好像是无权限 啊 我注册 FSO 组件N 次都是这个问题
...全文
46 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
Url重写系列篇: ----主讲:天涯浪子 本讲将通过实例比较ASP.NET下的三种典型URL重写方案——ISAPI重写(使用开源组件IIRF),ASP.NET2.0内置的urlMappings和基于自定义HTTPModule的URL重写(使用NBear.Web中的UrlRewriteModule实现),并探讨URL重写中可能遇到的陷阱及处理办法。 需要手动为UrlRewriteWebSite目录添加一个到http://localhost/UrlRewriteWebSite的同名虚拟目录,允许匿名访问,并设置目录默认页为default.aspx。 另外,为了启用IIRF的URL重写支持,需要将UrlRewriteWebSite/bin目录下的IsapiRewrite4.dll添加为IIS默认网站的ISAPI过滤器。[相应资料打压缩包] 重写原理: 用户(A)----->系统运行(C) 真实地址 用真实地址运行 用户(A)----->转换器(B)----->系统运行(C) 假地址 将用户假地址 用真实地址运行 转换为真实地址 重写规则 注意,我们的演示程序中将混合使用三种方式的URL重写,因此,需要为三种实现分别设置一些URL重写规则: 1、IIRF,对于IIRF,对应于IsapiRewrite4.dll,在相同的目录会有一个IsapiRewrite4.ini文件,除了默认的一些设置,我们在文件末尾添加了几条自定义规则如下: # Custom RewriteRules RewriteRule ^/UrlRewriteWebSite/test(.*).aspx /UrlRewriteWebSite/Default.aspx?page=$1 RewriteRule ^/UrlRewriteWebSite/folder/(.*).aspx /UrlRewriteWebSite/Default.aspx?folder=$1 RewriteRule ^/UrlRewriteWebSite/folder/? /UrlRewriteWebSite/Default.aspx?folder=default 熟悉正则表达式的朋友应该很容易理解上面这三条规则。 规则一将形如testXXX.aspx这样的页面访问,重写为Default.aspx?page=XXX这样的页面; 规则二将形如folder/XXX.aspx的路径,重写为Default.aspx?folder=XXX这样的页面; 规则三将不带任何文件的folder目录的访问,重写为Default.aspx?folder=default这样的页面。 2、urlMappings是ASP.NET2.0内置支持的URL重写配置块,它应该包含在web.config的配置块中。但是,这个内置的URL重写支持不支持正则表达式,因而只能用来实现一对一的路径和页面的重写。urlMappings的配置内容包含在下面的Web.config文件中。 3、NBear.Web.Modules.UrlRewriteModule则是NBear中实现的一个基于HTTPModule的URL重写实现,它允许使用正则表达式来描述重写规则。 注意,代码中包含了urlMappings配置和用于NBear.Web.Modules.UrlRewriteModule重写规则。为了比较着几种重写方案,正则表达式基本上是和前面的IIRF定义中的规则类似的。 页面测试 定义完这些重写规则,我们就可以试着在页面中使用它们了。例如,如果我们写一个测试页面如下: Default.aspx Default.aspx.cs public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Write(Request.Path + "?" + Request.ServerVariables["QUERY_STRING"]); } } 注意,Default.aspx页面会输出当前呈现的实际页面及其QueryString参数。 运行该页面,分别点击页面中的链接,我们会看到,貌似所有的URL重写一切正常。但是,当试着点击页面中的按钮,我们马上会发现,页面postback后,浏览器地址栏中的链接变成了那个被重写后的地址,而不是,原来显示于地址栏的虚拟地址了。这是一个严重的不一致,没道理我点击页面的按钮,在没有跳转到其他页面的情况下,地址栏显示另一个页面地址,不是吗? 要解决这个问题,我们只需要为form添加一个onsubmit事件处理如下:
添加该事件处理,就能在页面postback提交之前,重置页面的地址。 为前面的页面添加onsubmit之后,我们发现,postback不再会改变地址栏地址显示了。 注意:你确认试过点击最后一组链接中的buildin default page和section default page了吗? 你会发现,这两个链接根本不能显示。为什么呢?为什么类似的folder default page可以正常显示,而另两个不能显示呢? 回到前面的规则定义部分,我们就能发现,folder default page使用的是由IIRF这个ISAPI定义的规则,而另两个则使用的是内置于ASP.NET2.0的HTTPModule的重写规则(本质上,urlMappings也是使用HTTPModule来实现重写的,所以,除了不支持正则表达式之外,它也包含自定义HTTPModule方式实现的所有缺点)。 在IIS的ISAPI层面,是可以截获所有的页面请求的,哪怕指定的页面、目录根本不存在。但是,ASP.NET解析器则只有在对页面的请求被IIS转发过来时,才能处理。我们知道,IIS可以忽略对链接的虚拟目录是否存在的检测,但是,却无法检测非ASP.NET支持的文件扩展名的链接(我们固然可以在IIS中将所有类型的扩展名都映射到ASP.NET解析器,但是,如果我们有设置IIS的权限,为什么还要用性能更低,限制更多的ASP.NET方式的URL重写,而不使用基于ISAPI方式的重写呢?)。所以,为了让这两个不能显示的页面能正常显示,一方面,我们要在IIS中设置默认页,如default.aspx,另一方面,需要让IIS对某个不带aspx扩展名的链接,如这里只包含某个目录的名称的链接转发到默认页。 要做到这一点,我们需要在我们的应用程序中,为buildin和section分别将两个对应的目录,并且,在目录中创建两个空的default.aspx页面。尽管这样的default.aspx页面实际上永远不会被真正执行,但是有他们的帮助,就能让IIS顺利地将页面请求转发至ASP.NET解析器,从而,使得基于HTTPModule的URL重写规则,被执行。 好了,创建这两个目录及default.aspx文件,我们就能修复该问题了。 接下来我们先做点测试: 我们来对页面上的链接反复点击点击,folder page -> section page -> folder page -> section page...等等,打住,看到浏览器地址栏发生了什么吗?这不是恐怖活动,但是。。。也差不多了。我们看到我们可爱的地址,变成了...folder/section/folder/section...aspx。 想想是为什么呢?看看我们的aspx文件。。。我想你一定想到了。对了,都是相对路径惹的祸! 我们可爱的的相对路径一顶是同学们最常使用的,但是,浏览器在处理相对路径时,是以浏览器上接受的url地址为基础进行计算的,也就是说,如果当前的地址为folder/1.aspx,那么,很显然,./section/2.aspx这个页面,对应的自然是folder/section/2.aspx了,问题就出在这儿了!没有URL重写时,不会有这样的情况出现。但是URL重写,并且,将一个带假目录的虚拟地址重写到一个不带假目录的页面时,由于浏览器客户端和服务端此时的当前页面计算方法是不同的,就会发生相对路径的匹配错误问题!真实很严重的问题啊! 解决的办法,只有使用绝对路径!但是,我们当然不会傻到对每个链接直接使用绝对路径的,呵呵:) 将Default.aspx中的所有相对路径都使用Page.ResolveUrl进行包装如下,在输出页面时就将地址转换为绝对路径,就能解决这个恐怖的相对路径陷阱了。当然,也别忘了加上onsubmit事件处理代码: Default.aspx 好了,再试一试点击页面上的链接和按钮,多点几 谢谢………… 参考资料: 引言 让我们花点时间来看一下网站上的一些 URL。您是否发现一些类似于 http://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summary 的 URL?或者,您可能将一系列网页从一个目录或网站移动到另一个目录或网站,结果导致已将旧 URL 用作书签的访问者断开链接。在本文中,我们将了解如何通过将 http://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summary 替换为类似于 http://yoursite.com/people/sales/chuck.smith 的网址,使用 URL 重写将那些冗长的 URL 缩写为富有意义且容易记忆的 URL。我们还将了解如何将 URL 重写用于创建智能 404 错误。 URL 重写是截取传入 Web 请求并自动将请求重定向到其他资源的过程。执行 URL 重写时,通常会检查被请求的 URL,并基于 URL 的值将请求重定向到其他 URL。例如,在进行网站重组而将 /people/ 目录下的所有网页移动到 /info/employees/ 目录中时,您可能希望使用 URL 重写来检查 Web 请求是否指向了 /people/ 目录中的文件。如果请求指向 /people/ 目录中的文件,您可能希望自动将请求重定向到 /info/employees/ 目录中的同一文件。 使用传统的 ASP,应用 URL 重写的唯一方法是编写 ISAPI 筛选器,或者购买提供 URL 重写功能的第三方产品。但是,使用 Microsoft® ASP.NET,您可以通过很多方法来轻松地创建您自己的 URL 重写软件。本文讨论了可供 ASP.NET 开发人员实现 URL 重写的各种技术,然后讨论了 URL 重写的一些实际使用情况。在深入讨论 URL 重写的技术细节之前,让我们先看一些可以使用 URL 重写的日常情景。 URL 重写的常见用法 创建数据驱动的 ASP.NET 网站时,通常会产生一个单个的网页,该网页基于查询字符串参数显示数据库数据的子集。例如,在设计电子商务站点时,您的任务之一便是允许用户浏览待售产品。为此,您可以创建一个名为 displayCategory.aspx 的页面,该页面将显示给定类别的产品。可以通过查询字符串参数来指定要查看的该类别的产品。也就是说,如果用户要浏览待售的 Widget 产品,并且所有 Widget 产品的 CategoryID 均为 5,则用户可以访问以下网址:http://yousite.com/displayCategory.aspx?CategoryID=5。 创建具有此类 URL 的网站有两点不足:首先,从最终用户的角度考虑,URL http://yousite.com/displayCategory.aspx?CategoryID=5 比较杂乱。可用性专家 Jakob Neilsen 建议遵循以下标准来选择 URL: • 简短。 • 易于键入。 • 可以看出站点的结构。 • “可删节”,允许用户通过删除 URL 的组成部分来浏览站点。 我还要增加一条标准,即,URL 应该便于记忆。URL http://yousite.com/displayCategory.aspx?CategoryID=5 不符合 Neilsen 的任何标准,也不容易记住。要求用户键入查询字符串值将使 URL 的键入变得非常困难,并且只有了解查询字符串参数的用途及其名称/值对结构的富有经验的 Web 开发人员才能够对 URL 进行“删节”。 较好的方法是允许使用切合实际且容易记忆的 URL,如 http://yoursite.com/products/Widgets。只要看一眼 URL,您便可以推断出将要显示的内容 -- 有关 Widget 的信息。此 URL 也很容易记住和共享。我可以告诉我的同事“请查看 yoursite.com/products/Widgets,”,她可能无需再问我 URL 是什么即可打开该页面。(尝试一下,您只需说出“Amazon.com 页面”即可!)此 URL 还将显示出来,并且应该是“可删节”的。也就是说,如果用户删去 URL 的末端,键入 http://yoursite.com/products,他们应该看到所有产品的列表,或者至少应该看到他们可以查看的所有类别的产品列表。 注意:要获得“可删节”URL 的最好示例,可考虑使用由许多 blog 引擎生成的 URL。要查看 2004 年 1 月 28 日的帖子,用户可以访问诸如 http://someblog.com/2004/01/28 的 URL。如果该 URL 被删节为 http://someblog.com/2004/01,用户将看到 2004 年 1 月的所有帖子。将该 URL 进一步删节为 http://someblog.com/2004 将显示 2004 年的所有帖子。 除了简化 URL 之外,URL 重写还经常用于处理网站重组,以免导致大量链接断开或书签过期。 请求到达 IIS 时将会发生什么情况 在正式研究 URL 如何实现重写之前,应首先了解 Microsoft® Internet Information Services (IIS) 如何处理传入请求,这一点非常重要。当请求到达 IIS Web 服务器时,IIS 检查被请求文件的扩展名以确定如何处理该请求。IIS 可以自行处理请求(如 HTML 页面、图像以及其他静态内容),或者将请求路由到 ISAPI 扩展。(ISAPI 扩展是一个处理传入 Web 请求的非托管编译类。其任务是生成被请求资源的内容。) 例如,当传入针对 Info.asp 网页的请求时,IIS 会将此消息路由到 asp.dll ISAPI 扩展。然后,该 ISAPI 扩展将加载被请求的 ASP 页面,执行该页面,并将所呈现的 HTML 返回给 IIS,然后,IIS 将该 HTML 发送回请求客户端。对于 ASP.NET 页面,IIS 会将此消息路由到 aspnet_isapi.dll ISAPI 扩展。然后,aspnet_isapi.dll ISAPI 扩展将处理操作传递给托管的 ASP.NET 辅助进程,该辅助程序将处理请求,并返回 ASP.NET 网页的呈现 HTML。 您可以自定义 IIS,以指定扩展名与 ISAPI 扩展的映射关系。图 1 显示了 Internet Information Services 管理工具的“应用程序配置”对话框。请注意,与 ASP.NET 有关的扩展名(.aspx、ascx、config、asmx、rem、cs、vb 及其他)均已映射到 aspnet_isapi.dll ISAPI 扩展。 图 1. 已配置的文件扩展名映射 讨论 IIS 如何管理传入请求稍稍超出了本文范围。但是可以在 Michele Leroux Bustamante 的文章 Inside IIS and ASP.NET 中找到对此内容的深入讨论。ASP.NET 引擎仅处理那些扩展名已明确映射至 IIS 中的 aspnet_isapi.dll 的传入 Web 请求,了解这一点非常重要。 使用 ISAPI 筛选器检查请求 IIS 除了可以将传入 Web 请求的文件扩展名映射到相应的 ISAPI 扩展之外,还将执行许多其他任务。例如,IIS 将尝试对发出请求的用户进行身份验证,并确定通过身份验证的用户是否有权限访问被请求的文件。在处理请求的有效期内,IIS 将经历几个状态。在每个状态下,IIS 都将引发可以使用 ISAPI 筛选器以编程方式进行处理的事件。 与 ISAPI 扩展一样,ISAPI 筛选器是在 Web 服务器上安装的非托管代码块。ISAPI 扩展被设计为可以响应针对特定文件类型的请求。另一方面,ISAPI 筛选器还包含可以对 IIS 引发的事件进行响应的代码。ISAPI 筛选器可以截取甚至修改传入和传出的数据。ISAPI 筛选器可以应用于很多方面,包括: • 身份验证和授权。 • 记录和监视。 • HTTP 压缩。 • URL 重写。 虽然 ISAPI 筛选器可用于执行 URL 重写,但本文将讨论如何使用 ASP.NET 实现 URL 重写。不过,我们将对使用 ISAPI 筛选器与使用 ASP.NET 中的技术实现 URL 重写进行权衡。 请求进入 ASP.NET 引擎时将会发生什么情况 在 ASP.NET 之前,需要使用 ISAPI 筛选器来实现 IIS Web 服务器上的 URL 重写。由于 ASP.NET 引擎与 IIS 非常相似,因此可以使用 ASP.NET 进行 URL 重写。存在相似之处的原因在于 ASP.NET 引擎可以实现以下功能: • 在处理请求时可以引发事件。 • 允许任意数量的 HTTP 模块处理所引发的事件,这与 IIS 的 ISAPI 筛选器相似。 • 将呈现被请求资源这项任务委托给 HTTP 处理程序,该处理程序与 IIS 的 ISAPI 扩展相似。 与 IIS 一样,ASP.NET 引擎在请求的有效期内将会触发事件,通过发信来表示其处理过程从一个状态改变为了另一个状态。例如,当 ASP.NET 引擎首响应请求时,BeginRequest 事件将被触发。接下来触发的是 AuthenticateRequest 事件,该事件在已建立用户标识时出现。(此外,还有大量的其他事件:AuthorizeRequest、ResolveRequestCache 和 EndRequest,等等。这些事件属于 System.Web.HttpApplication 类;有关详细信息,请参阅位于以下网址的技术文档:HttpApplication Class Overview。) 正如上一部分所讨论的,可以创建 ISAPI 筛选器以响应 IIS 引发的事件。同样,ASP.NET 提供了 HTTP 模块,该模块可以响应由 ASP.NET 引擎引发的事件。可以将 ASP.NET Web 应用程序配置为具有多个 HTTP 模块。对于由 ASP.NET 引擎处理的每个请求,将初始化每个已配置的 HTTP 模块,并允许将事件处理程序绑定到处理请求期间所引发的事件。请注意,对每个请求均使用了许多内置 HTTP 模块。其中的一个内置 HTTP 模块是 FormsAuthenticationModule,该模块首先检查是否使用了窗体身份验证,如果使用,将检查是否对用户进行了身份验证。如果没有使用,会自动将用户重定向到指定的登录页面。 如上所述,通过使用 IIS,传入请求将最终发送给 ISAPI 扩展,而 ISAPI 扩展的任务是返回特定请求的数据。例如,在请求传统的 ASP 网页时,IIS 将请求传递给 asp.dll ISAPI 扩展,该扩展的任务是返回被请求的 ASP 页面的 HTML 标记。ASP.NET 引擎使用相似的方法。初始化 HTTP 模块后,ASP.NET 引擎的下一项任务是确定应由哪个 HTTP 处理程序来处理请求。 所有通过 ASP.NET 引擎传递的请求最终都将到达 HTTP 处理程序或 HTTP 处理程序工厂(HTTP 处理程序工厂仅返回 HTTP 处理程序的实例,然后使用该实例来处理请求)。最终的 HTTP 处理程序将返回响应,即呈现被请求的资源。此响应将被发送回 IIS,然后 IIS 将响应返回给提出请求的用户。 ASP.NET 包括许多内置的 HTTP 处理程序。例如,PageHandlerFactory 用于呈现 ASP.NET 网页。WebServiceHandlerFactory 用于呈现 ASP.NET Web 服务的响应 SOAP 信封。TraceHandler 将向 trace.axd 呈现请求的 HTML 标记。 图 2 描述了如何处理对 ASP.NET 资源的请求。首先,IIS 接收到请求,并将请求调度给 aspnet_isapi.dll。接下来,ASP.NET 引擎对已配置的 HTTP 模块进行初始化。最后将调用正确的 HTTP 处理程序,并呈现被请求的资源,将所生成的标记返回给 IIS 和请求客户端。 图 2. IIS 和 ASP.NET 正在处理请求
未来的视窗、组件程序的设计潮流,将是采用.NET平台为底层服务,并使用C#语言开发。C#是微软为.NET技术量身订制的语言,它拥有简洁的语法和便于开发的特性。本书将C#的特色与应用,借助实战演练的方式,阶段性地引导读者建置完整的应用程序,是您掌握新技术的最佳捷径。【图书目录】-C#与.NET技术平台实战演练PARTI基础语法篇第1章.NET概述1-1 软件开发结构的演进1-2 桌上型单机应用程序1-3 主从结构应用程序1-4 分布式应用程序结构1-4-1 WindowsDNA(WindowsDistributedInternetArchitecture)1-4-2 WindowsDNA20001-5 下一代的互联网平台:Microsoft.NET1-5-1.NETFramework1-5-2 公共语言执行环境1-5-3 类函数库1-5-4 .NET程序语言第2章C#概论2-1C#应用程序的结构2-1-1 分析C#应用程序结构2-1-2 Using前置命令与System名称空间2-2 标准的输入/输出2-2-1 输出字符串到Console2-2-2格式化输出字符申2-2-3 读取数据2-3 程序代码注释生成XML文件2-4 编译C#应用程序编译器选项第3章实值类型变量3-1 公共类型系统3-2 实值类型与参考类型实值类型与参考类型的差异3-3 找寻基础类3-4 实值类型3-4-1 简单类型3-4-2 命名原则3-4-3 定义变量3-4-4 指定变量的值3-5常用的操作数使用递增与递减操作数3-6 操作数优先顺序3-7 使用列举类型3-7-1enum类型常用的方法3-7-2使用enum类型常犯的错误3-8使用struct类型3-9 数据类型转换3-9-1 隐含式转换3-9-2明确式转换第4章语句与例外处理4-1 程序区块4-2 语句类型4-2-1 if语句4-2-2 串联if(cascadingif)4-2-3switch语句4-2-4在switch中使用goto4-3重复执行的语句4-3-1while语句4-3-2do语句4-3-3for语句4-3-4foreach语句4-4跳转语句4-4-lgoto语句4-4-2break与continue语旬4-5例外错误4-5-1生成例外错误4-5-2检查数值溢出第5章方法与参数5-l定义方法定义方法的语法5-2调用其他类的方法使用return跳出程序区段5-3声明局域变量5-4共用变量变量范围冲突5-5使用返回值非void的方法必须有返回值5-6声明与使用参数声明参数的语法5-7参数传递机制5-7-1使用传值参数5-7-2使用传出参数5-7-3使用传参考参数5-8使用传参考参数常见的错误5-9声明不定长度的参数使用foreach语句5-10使用递回方法5-11覆写方法第6章数组6-1什么是数组?6-2声明数组6-3数组维数6-4存取数组元素6-5使用Length属性检查数组上下限6-6 数组与集合的比较6-7 声明时初始化数组6-7-1 使用简短的表示法6-7-2 初始化多维的数组6-8 执行时期指定数组的大小6-9 JaggedArray6-10 复制数组变量6-11 数组的应用6-11-l 数组常用的属性6-11-2 数组常用的方法6-11-3 由方法返回一个数组6-11-4 把数组当参数传递6-12 命令提示符参数第7章面向对象程序设计7-1 面向对象的缘由7-1-1 增加程序代码重复使用7-1-2 原始程序代码共用阶段7-2 类7-3 名称空间7-4 降低维护的负担7-5 数据封装7-6 继承7-7 多态7-8 抽象化使用接口第8章类.名称空间8-1 类与对象8-l-1 类的成员8-l-2 对象8-1-3 定义类的语法8-2 类与结构的比较结构适用于"轻量型"的对象8-3 数据封装8-4 数据与方法的存取控制8-4-1 使用成员访问修饰符8-4-2 良好的数据隐藏方式设计8-4-3 数据封装的目的8-5 使用静态成员8-5-1 声明及初始化静态数据8-5-2 使用静态方法8-5-3 静态成员使用准则8-6 C#与面向对象8-6-1 再探HelloWorld8-6-2以static定义Main8-7定义类与建立实体this操作数8-8使用访问修饰符8-9建立嵌套类8-10名称空间8-10-1声明名称空间8-10-2名称空间的领域8-10-3使用名称空间的好处8-10-4名称空间存取控制8-11完全区别名称8-12使用using前置命令建立阶层式类结构8-13使用别名8-14使用命名空间的准则第9章参考类型变量9-1使用参考类型变量9-2参考类型与实值型9-2-1实值类型9-2-2参考类型9-2-3实值类型与参考类型差异9-3声明与释放参考类型变量9-3-1声明参考类型变量9-3-2释放参考类型变量9-4比较参考类型变量与实值类型变量9-5多个参考类型变量参考到同一个对象9-6以参考变量当做方法的参数9-7常用的参考类型9-7-1Exception类9-7-2String类9-7-3比较字符串的方法与操作数9-7-4C#对象阶层结构9-8.NETFramework常用的类9-8-1System.IO9-8-2System.XML9-9数据类型转换9-9-1隐含式转换9-9-2明确式转换9-10Parent与Child之间的转换9-10-1转换成ParentClass的参考9-10-2转换成ChildClass的参考9-11使用is操作数9-12使用as操作数9-13Object类型转换守则9-14Boxing与Unboxing9-14-1Boxing9-14-2UnBoxing第10章对象的生与死10-1了解构造器10-1-1使用new取得内存10-1-2ManagedHeap内存配置10-1-3初始化对象10-2默认构造器10-2-l默认构造器的特性10-2-2编译器自动生成的构造器10-2-3定义默认构造器10-2-4定义构造器原则10-3覆写构造器10-4覆写构造器潜在的问题10-4-1解决重复初始化程序代码的问题10-4-2使用consbuctor-initializer10-5初始化只读数据10-6在构造器中使用out与ref10-7struct构造器10-7-1struct构造器的限制10-8static构造器10-8-1使用static构造器初始化静态成员10-8-2static构造器的限制10-9对象与内存10-9-l对象的生命周期10-9-2局域变量的生命周期10-9-3对象的生命周期10-10谁来"摧毁"对象?C#借由回收站回收资源10-11使用Finalize方法Finalize对效率的影响10-12编写析构器使用析构器的考虑10-13实现IDisposable接口第11章继承.多态与接口11-l扩充基础类的功能11-1-l继承的语法11-l-2简单的UML描述11-2扩充类的继承11-2-1使用访问修饰符控制存取权限11-2-2protected成员的继承11-3调用基础类的构造器声明构造器ll-4改写基础类的方法11-4-1定义虚拟方法ll-4-2虚拟方法与改写方法的守则11-5隐藏基础类方法11-6使用sealed类与sealed方法11-7版本控制11-8使用接口接口的特点11-9 以明确的方式实现接口11-10 抽象类11-10-1 抽象方法11-10-2 不实现接口的抽象类11-11 抽象类与接口11-12 抽象方法与版本控制第12章属性与索引12-1 组件定义12-2 属性12-2-1 为什么要用属性?12-2-2 使用属性的好处12-3 属性的种类12-4 使用存取元12-4-1 使用get存取元12-4-2 使用set存取元12-4-3 使用get.set存取元12-5 编译器运作的情形12-6 属性与类数据成员的比较12-6-1 属性是逻辑上的类数据成员12-6-2 属性和数据成员的相似性12-6-3 属性和数据成员的不同点12-7 存取属性与类数据成员的比较12-8 属性与方法的比较12-8-l 属性和方法之间的相似性12-8-2 属性和方法之间的不同点12-9 索引的使用12-9-1 为什么要使用索引?12-9-2 定义索引12-10 索引和数组的比较12-11 覆写Indexer12-12 Indexer与属性的比较12-12-1 Indexer与属性的相似性12-12-2Indexer与属性的不同点12-l3Indexer设计准则第13章操作数.Delegate事件13-1 覆写操作数13-1-1 覆写操作数的语法13-1-2 覆写相同的操作数多13-1-3 Conversion操作数l3-2 建立并使用delegate类型建立delegate类型l3-3 事件13-3-1 在事件发行者中定义一个事件13-3-2 在事件发行者中触发事件13-3-3 在事件订阅者中定义事件处理常式13-3-4 向事件发行者订阅一个事件l3-4 链接.删除事件设计准则l3-5 .NETFramewoek事件设计准则13-6传递事件的参数13-6-1Sender对象与事件参数13-6-2定义delegate函数样板13-6-3EventArgs类的设计l3-6-4事件处理常式的编写13-6-5触发事件第14章Attribute与Iteflection14-l何谓Attribute?14-2使用AttributeGlobalAttribute14-3自定义Attribute类14-3-1Attribute适用的元素14-3-2设计Attribute类14-3-3使用Attribute14-3-4Attribute编译的过程14-3-5使用positional参数与named参数14-3-6取得Attribute的值14-4Renection14-4-1Renection设计理念14-4-2MetadataPARTII实战演练篇第15章编写数据库应用程序15-1建立用户界面15-2编写公用函数15-3读取数据库数据,以及建立DataSet15-4自定义dataGrid展示样式15-5添加.删除.修改数据15-6增加核对程序运作的程序代码第16章编写Master/Detail数据库应用程序16-1建立Master/Detail关系的DataSet16-2自定义dataGrid展示样式16-3设计显示明细数据的表单16-4 使用BindingContext浏览数据第17章设计WindowsFrom应用程序17-1 设计MDI应用程序17-1-1 使用StatusBar与Timer控件17-1-2 设计选单17-1-3 编写选单程序代码17-2 设计GDI十应用程序17-2-1 绘制统计图表17-2-2 使用FontDialog设置字体17-2-3 设置打印格式17-2-4 打印预览与打印报表17-2-5 使用PrintDialog选择打印机17-2-6 保存图形文件第18章使用COM+服务18-1 编写.NET组件18-2 编写转帐类18-3 建立KeyFile与StrongName18-4 建立客户端的接口18-5 测试COM+应用程序第19章编写一个监控文件事务的WindowsService19-1使用WindowsService模板19-2使用EventLog与FileSystemWatcher控件19-3使用Installer类19-4安装WindowsServics19-5启动服务与暂停服务第20章编写文件管理器20-1 建立UCOMFileManger用户界面20-2 编写初始化应用程序的程序代码20-3 编写事件程序20-4 打开文本文件第21章编写提供数据的WebService21-1 建立WebService21-2 编写使用WebService的WindowsForms客户端第22章编写ASP.NET网页22-1建立ASP.NET项目22-2设计分页22-3增加编辑数据的按钮22-4编写修改.取消.保存按钮事件处理常式22-5编写添加功能22-6编写删除功能
未来的视窗、组件程序的设计潮流,将是采用.NET平台为底层服务,并使用C#语言开发。C#是微软为.NET技术量身订制的语言,它拥有简洁的语法和便于开发的特性。本书将C#的特色与应用,借助实战演练的方式,阶段性地引导读者建置完整的应用程序,是您掌握新技术的最佳捷径。【图书目录】-C#与.NET技术平台实战演练PARTI基础语法篇第1章.NET概述1-1 软件开发结构的演进1-2 桌上型单机应用程序1-3 主从结构应用程序1-4 分布式应用程序结构1-4-1 WindowsDNA(WindowsDistributedInternetArchitecture)1-4-2 WindowsDNA20001-5 下一代的互联网平台:Microsoft.NET1-5-1.NETFramework1-5-2 公共语言执行环境1-5-3 类函数库1-5-4 .NET程序语言第2章C#概论2-1C#应用程序的结构2-1-1 分析C#应用程序结构2-1-2 Using前置命令与System名称空间2-2 标准的输入/输出2-2-1 输出字符串到Console2-2-2格式化输出字符申2-2-3 读取数据2-3 程序代码注释生成XML文件2-4 编译C#应用程序编译器选项第3章实值类型变量3-1 公共类型系统3-2 实值类型与参考类型实值类型与参考类型的差异3-3 找寻基础类3-4 实值类型3-4-1 简单类型3-4-2 命名原则3-4-3 定义变量3-4-4 指定变量的值3-5常用的操作数使用递增与递减操作数3-6 操作数优先顺序3-7 使用列举类型3-7-1enum类型常用的方法3-7-2使用enum类型常犯的错误3-8使用struct类型3-9 数据类型转换3-9-1 隐含式转换3-9-2明确式转换第4章语句与例外处理4-1 程序区块4-2 语句类型4-2-1 if语句4-2-2 串联if(cascadingif)4-2-3switch语句4-2-4在switch中使用goto4-3重复执行的语句4-3-1while语句4-3-2do语句4-3-3for语句4-3-4foreach语句4-4跳转语句4-4-lgoto语句4-4-2break与continue语旬4-5例外错误4-5-1生成例外错误4-5-2检查数值溢出第5章方法与参数5-l定义方法定义方法的语法5-2调用其他类的方法使用return跳出程序区段5-3声明局域变量5-4共用变量变量范围冲突5-5使用返回值非void的方法必须有返回值5-6声明与使用参数声明参数的语法5-7参数传递机制5-7-1使用传值参数5-7-2使用传出参数5-7-3使用传参考参数5-8使用传参考参数常见的错误5-9声明不定长度的参数使用foreach语句5-10使用递回方法5-11覆写方法第6章数组6-1什么是数组?6-2声明数组6-3数组维数6-4存取数组元素6-5使用Length属性检查数组上下限6-6 数组与集合的比较6-7 声明时初始化数组6-7-1 使用简短的表示法6-7-2 初始化多维的数组6-8 执行时期指定数组的大小6-9 JaggedArray6-10 复制数组变量6-11 数组的应用6-11-l 数组常用的属性6-11-2 数组常用的方法6-11-3 由方法返回一个数组6-11-4 把数组当参数传递6-12 命令提示符参数第7章面向对象程序设计7-1 面向对象的缘由7-1-1 增加程序代码重复使用7-1-2 原始程序代码共用阶段7-2 类7-3 名称空间7-4 降低维护的负担7-5 数据封装7-6 继承7-7 多态7-8 抽象化使用接口第8章类.名称空间8-1 类与对象8-l-1 类的成员8-l-2 对象8-1-3 定义类的语法8-2 类与结构的比较结构适用于"轻量型"的对象8-3 数据封装8-4 数据与方法的存取控制8-4-1 使用成员访问修饰符8-4-2 良好的数据隐藏方式设计8-4-3 数据封装的目的8-5 使用静态成员8-5-1 声明及初始化静态数据8-5-2 使用静态方法8-5-3 静态成员使用准则8-6 C#与面向对象8-6-1 再探HelloWorld8-6-2以static定义Main8-7定义类与建立实体this操作数8-8使用访问修饰符8-9建立嵌套类8-10名称空间8-10-1声明名称空间8-10-2名称空间的领域8-10-3使用名称空间的好处8-10-4名称空间存取控制8-11完全区别名称8-12使用using前置命令建立阶层式类结构8-13使用别名8-14使用命名空间的准则第9章参考类型变量9-1使用参考类型变量9-2参考类型与实值型9-2-1实值类型9-2-2参考类型9-2-3实值类型与参考类型差异9-3声明与释放参考类型变量9-3-1声明参考类型变量9-3-2释放参考类型变量9-4比较参考类型变量与实值类型变量9-5多个参考类型变量参考到同一个对象9-6以参考变量当做方法的参数9-7常用的参考类型9-7-1Exception类9-7-2String类9-7-3比较字符串的方法与操作数9-7-4C#对象阶层结构9-8.NETFramework常用的类9-8-1System.IO9-8-2System.XML9-9数据类型转换9-9-1隐含式转换9-9-2明确式转换9-10Parent与Child之间的转换9-10-1转换成ParentClass的参考9-10-2转换成ChildClass的参考9-11使用is操作数9-12使用as操作数9-13Object类型转换守则9-14Boxing与Unboxing9-14-1Boxing9-14-2UnBoxing第10章对象的生与死10-1了解构造器10-1-1使用new取得内存10-1-2ManagedHeap内存配置10-1-3初始化对象10-2默认构造器10-2-l默认构造器的特性10-2-2编译器自动生成的构造器10-2-3定义默认构造器10-2-4定义构造器原则10-3覆写构造器10-4覆写构造器潜在的问题10-4-1解决重复初始化程序代码的问题10-4-2使用consbuctor-initializer10-5初始化只读数据10-6在构造器中使用out与ref10-7struct构造器10-7-1struct构造器的限制10-8static构造器10-8-1使用static构造器初始化静态成员10-8-2static构造器的限制10-9对象与内存10-9-l对象的生命周期10-9-2局域变量的生命周期10-9-3对象的生命周期10-10谁来"摧毁"对象?C#借由回收站回收资源10-11使用Finalize方法Finalize对效率的影响10-12编写析构器使用析构器的考虑10-13实现IDisposable接口第11章继承.多态与接口11-l扩充基础类的功能11-1-l继承的语法11-l-2简单的UML描述11-2扩充类的继承11-2-1使用访问修饰符控制存取权限11-2-2protected成员的继承11-3调用基础类的构造器声明构造器ll-4改写基础类的方法11-4-1定义虚拟方法ll-4-2虚拟方法与改写方法的守则11-5隐藏基础类方法11-6使用sealed类与sealed方法11-7版本控制11-8使用接口接口的特点11-9 以明确的方式实现接口11-10 抽象类11-10-1 抽象方法11-10-2 不实现接口的抽象类11-11 抽象类与接口11-12 抽象方法与版本控制第12章属性与索引12-1 组件定义12-2 属性12-2-1 为什么要用属性?12-2-2 使用属性的好处12-3 属性的种类12-4 使用存取元12-4-1 使用get存取元12-4-2 使用set存取元12-4-3 使用get.set存取元12-5 编译器运作的情形12-6 属性与类数据成员的比较12-6-1 属性是逻辑上的类数据成员12-6-2 属性和数据成员的相似性12-6-3 属性和数据成员的不同点12-7 存取属性与类数据成员的比较12-8 属性与方法的比较12-8-l 属性和方法之间的相似性12-8-2 属性和方法之间的不同点12-9 索引的使用12-9-1 为什么要使用索引?12-9-2 定义索引12-10 索引和数组的比较12-11 覆写Indexer12-12 Indexer与属性的比较12-12-1 Indexer与属性的相似性12-12-2Indexer与属性的不同点12-l3Indexer设计准则第13章操作数.Delegate事件13-1 覆写操作数13-1-1 覆写操作数的语法13-1-2 覆写相同的操作数多13-1-3 Conversion操作数l3-2 建立并使用delegate类型建立delegate类型l3-3 事件13-3-1 在事件发行者中定义一个事件13-3-2 在事件发行者中触发事件13-3-3 在事件订阅者中定义事件处理常式13-3-4 向事件发行者订阅一个事件l3-4 链接.删除事件设计准则l3-5 .NETFramewoek事件设计准则13-6传递事件的参数13-6-1Sender对象与事件参数13-6-2定义delegate函数样板13-6-3EventArgs类的设计l3-6-4事件处理常式的编写13-6-5触发事件第14章Attribute与Iteflection14-l何谓Attribute?14-2使用AttributeGlobalAttribute14-3自定义Attribute类14-3-1Attribute适用的元素14-3-2设计Attribute类14-3-3使用Attribute14-3-4Attribute编译的过程14-3-5使用positional参数与named参数14-3-6取得Attribute的值14-4Renection14-4-1Renection设计理念14-4-2MetadataPARTII实战演练篇第15章编写数据库应用程序15-1建立用户界面15-2编写公用函数15-3读取数据库数据,以及建立DataSet15-4自定义dataGrid展示样式15-5添加.删除.修改数据15-6增加核对程序运作的程序代码第16章编写Master/Detail数据库应用程序16-1建立Master/Detail关系的DataSet16-2自定义dataGrid展示样式16-3设计显示明细数据的表单16-4 使用BindingContext浏览数据第17章设计WindowsFrom应用程序17-1 设计MDI应用程序17-1-1 使用StatusBar与Timer控件17-1-2 设计选单17-1-3 编写选单程序代码17-2 设计GDI十应用程序17-2-1 绘制统计图表17-2-2 使用FontDialog设置字体17-2-3 设置打印格式17-2-4 打印预览与打印报表17-2-5 使用PrintDialog选择打印机17-2-6 保存图形文件第18章使用COM+服务18-1 编写.NET组件18-2 编写转帐类18-3 建立KeyFile与StrongName18-4 建立客户端的接口18-5 测试COM+应用程序第19章编写一个监控文件事务的WindowsService19-1使用WindowsService模板19-2使用EventLog与FileSystemWatcher控件19-3使用Installer类19-4安装WindowsServics19-5启动服务与暂停服务第20章编写文件管理器20-1 建立UCOMFileManger用户界面20-2 编写初始化应用程序的程序代码20-3 编写事件程序20-4 打开文本文件第21章编写提供数据的WebService21-1 建立WebService21-2 编写使用WebService的WindowsForms客户端第22章编写ASP.NET网页22-1建立ASP.NET项目22-2设计分页22-3增加编辑数据的按钮22-4编写修改.取消.保存按钮事件处理常式22-5编写添加功能22-6编写删除功能
欢迎使用国内最专业的志愿者管理系统-八度志愿服务管理管理系统,它将是您轻松进行志愿工作的首选利器。bAdu VMS系统整合了CMS(新闻内容管理系统)、VEMS(志愿者活动管理系统)、VRMS(志愿者注册管理系统)、VCMS(志愿者认证管理系统)、VTMS(志愿者服务时数管理系统)等模块。通过这些系统模块帮助您的组织实现无纸化、无地域限制的志愿服务管理需求!真正意义上帮助您实现低碳办公的公益人追求的工作环境。 八度志愿活动管理系统 3.2.1 更新记录: 1、修复无法注册问题(打包时用旧文件覆盖新文件没发现,所以大家看到注册连接都是旧版的。。。这个很抱歉~~~); 2、修复注册后返回页面问题; 3、修复左侧导航显示问题(打包中用的是调用微博的代码,代码过期了所以就没得显示了); 4、修复头像上传及excel上传出问题(目前无法解决在Kangle服务器下上传失败问题,请大家尽量运行在IIS环境下); 5、增加安全判断,比如非入口文件调用访问app目录程序文件则自动跳转; 6、删除一些不用的文件。 主要实现功能: 1、活动可视化编辑发布; 2、活动报名批量审批功能; 3、会员数据通过Excel导入功能; 4、支持会员后台添加; 5、会员中心模块(可支持会员请假、取消、申请参加活动等操作); 6、服务时数记录模块。 适用对象: 1、各类小型公益机构; 2、已有会员注册系统或其他会员注册方式(本系统不支持会员前台注册,但可以后台导入会员基本登录信息进行管理); 3、本系统更倾向活动报名管理功能。 VMS的CMS模块采用模版技术,只需要调用标签即可进行页面数据调用。做到程序与页面分离,对用户设计模板、网站升级转移均提供很大的便利,健壮的模板标签为站长DIY自己的网站提供了强有力的支持。模型与模块概念并存:在模型不能满足用户所有需求的情况下,bAduVMS推出一些互动的模块对系统进行补充,尽量满足用户的需求。众多的应用支持:为用户提供了通用性的一体化解决方案,在本版本中,增加了新闻模块、志愿活动活动模块、志愿者注册认证模块、志愿服务时数管理模块等模块,补充一些用户的特殊要求。面向未来过渡:八度团队的组建为八度VMS的发展提供坚实的基础,在八度团队未来的构想中,它以后将会具有更大的灵活性和稳定的性能。 bAduVMS运行环境 bAduVMS 需要您的服务器是Windows 2000/2003/2008 操作系统,且WEB服务器环境软件使用的IIS,使用该软件需要您的IIS支持SSI(服务端文件包含)功能。 如果您租用虚拟主机,请咨询虚拟主机提供商,您的空间服务器是否已安装了上述软件。 bAduVMS应用领域 bAduVMS最适合应用于以下领域: • 共青团政府部门 通过建立共青团官方的志愿服务门户,有利于各种信息和资源的整合,为共青团和社会公众之间加强联系和沟通,从而使共青团工作可以更快、更便捷、更有效开展工作; • 公益机构 通过VMS的引入,使得公益机构之间及公益机构内部和志愿者之间进行信息传递,全面提升志愿服务工作的质量,实现科学、规范、专业的志愿管理工作生态环境; • 学校社团 针对不同院系,强化内部的信息划分,体现校园志愿工作的特色,轻松实现建立院系管理账,统一平台进行管理。 [第一安装] 将程序上传到网站前,请先打开Inc目录下的config.asp文件。找到并修改如下内容: const website = "上饶公益网" '网站名称 const weburl  = "/a/"  '网站主页地址,如果您是独立域名用户,可填写为 const weburl  = "/" 或 const weburl  = "http://你的域名/"。如果你将程序放在二级目录下,则设置为 const weburl  = "/二级目录名称/" 或 const weburl  = "http://你的域名/二级目录名称/" const webmdb  = "mdb/chenjun#bm.mdb" '数据库地址,请输入相对的如 abc/aa#add.mdb 该配置文件下的其他配置项目,可以登录后台后,通过管理后台进行修改设置。以免操作出错。 [登录账及密码] 管理员:badu 密  码:badu123 [如何修改导航菜单] 打开Inc目录下的menu.asp文件。修改你要设置的导航菜单名称等内容。 [如何修改上传目录及上传文件类型等设置?] 打开Inc目录下的config.asp文件。找到并修改以下代码: const webupload  = "upload"'上传目录 const webuploadtype  = "gi
如果用PHP不能再满足你的需求,最好的办法就是开发PHP扩展。这有一些好处: 1、增加自己的特殊功能。 2、保护自己的专利代码。 这是几年前的一篇英文文章,现在已被翻译成中文版的。 作者应该是hshq_cn。 链接是:http://bbs3.chinaunix.net/thread-1028798-1-1.html。 现我将此转变为PDF文件,仅有兴趣者参阅。同时非常感谢 原作者及hshq_cn,给我们带来的这么好的资料。里面还有一个幻灯片的,也是很有帮助的文档。另外,再提供一篇相关的文章(http://www.programbbs.com/doc/4083.htm): 编写php的extension实例的方法 所属类别:JSP 推荐指数:★★☆ 文档人气:161 本周人气:1 发布日期:2008-7-3 一、说明 前端时间因为客户的原因折腾了一下asp的扩展,在ATL的帮助下写一个asp的模块还是很容易的。不巧的时刚刚折腾完asp的COM就碰到另一个客户的问题。客户想给系统集成ICBC的接口,但是用ICBC的接口需要用他们的提供的库函数去 1. sign对发送的数据进行签名 2. getcertid获取用户证书的版本 3. verifySign对签名后的数据进行验证 问题是ICBC只给了现成的COM组件,意味在只能在Win的主机上使用。俺们公司只有linux的主机,在*nix上就要自己想办法调用ICBC给的静态库了。对此我们有两个想法 1.用ICBC的静态库做一个独立的执行文件,用PHP的系统调用函数来执行这个独立的执行文件 2.将ICBC的静态库做出一个PHP的扩展 方法一应该比较简单,但是远不如方法二的灵活。搞成PHP的扩展,只要服务器编译一,服务器上的所有客户都可以用的。 有ASP的前科,俺觉得搞个PHP的也不是什么难事。操起google搜了一通,结果发现Zend已经写了一个如何编写php extension的教程: http://devzone.zend.com/article/1021-Extension-Writing-Part-I-Introduction-to-PHP-and-Zend 浏览完牛人的大作,更是信心十足,php的扩展其实很简单,分七步走: 1. 制作编译配置文件:config.m4 2. 执行phpize生成扩展的框架 3. 在生成的php_xxx.h中声明自己写的函数 4. 在xxx.c中实现自己的函数 5. 编译自己的扩展 6. 将生成的xxx.so拷贝到php.ini中指定的extensions_dir 7. 在php.ini中打开xxx.so的调用 此问题问题唯一搞的地方就是在config.m4中折腾出正确的Makefile,因为Zend的教程中没有提到,俺自己也折腾了好久,才搞出来。 二、实际操作 1.建立工作环境 将php源码包解开,我的版本的php-4.4.4,转到源码包中的ext目录建立一个新的目录叫icbc,然后在icbc目录下touch三个文件config.m4、php_icbc.h、icbc.c 2.建立config.m4 内容如下: PHP_ARG_ENABLE(icbc, whether to enable ICBC support, [ --enable-icbc Enable ICBC support]) if test \"$PHP_ICBC\" = \"yes\"; then AC_DEFINE(HAVE_ICBC, 1, [Whether you have ICBC]) if test -f ./libicbcapi.a; then PHP_ADD_LIBRARY_WITH_PATH(icbcapi, ./, ICBCAPI_SHARED_LIBADD) PHP_SUBST(ICBCAPI_SHARED_LIBADD) AC_MSG_RESULT(checking for libicbcapi.a is OK) else AC_MSG_RESULT(libicbcapi.a not found) AC_MSG_ERROR(Please make sure the libicbcapi.a is in current directory) [Page] fi PHP_NEW_EXTENSION(icbc, icbc.c, $ext_shared) fi 第三行判断是否要启用icbc扩展, 第五行判断ICBC的静态库是否在当前目录(phpdir/ext/icbc)下 第六、七行将ICBC的静态库加入到编译环境中 3.在php_icbc.h中声明我们要导出的函数icbc_sign、icbc_vsign、icbc_getCertID #ifndef PHP_ICBC_H #define PHP_ICBC_H extern zend_module_entry icbc_module_entry; #define phpext_icbc_ptr &icbc_module_entry #ifdef PHP_WIN32 #define PHP_ICBC_API __declspec(dllexport) #else #define PHP_ICBC_API #endif #ifdef ZTS #include \"TSRM.h\" #endif PHP_MINIT_FUNCTION(icbc); PHP_MSHUTDOWN_FUNCTION(icbc); PHP_RINIT_FUNCTION(icbc); PHP_RSHUTDOWN_FUNCTION(icbc); PHP_MINFO_FUNCTION(icbc); /*Modify youself here*/ PHP_FUNCTION(icbc_sign); PHP_FUNCTION(icbc_vsign); PHP_FUNCTION(icbc_getCertID); /****End of Self control section***/ #ifdef ZTS #define ICBC_G(v) TSRMG(icbc_globals_id, zend_icbc_globals *, v) #else #define ICBC_G(v) (icbc_globals.v) #endif #endif /* PHP_ICBC_H */ 涉及到我们也就 PHP_FUNCTION(icbc_sign); PHP_FUNCTION(icbc_vsign); PHP_FUNCTION(icbc_getCertID); 其他的都是PHP各个状态的入口函数声明 4.编写这三个函数的实现: #ifdef HAVE_CONFIG_H #include \"config.h\" #endif #include \"php.h\" #include \"php_ini.h\" #include \"ext/standard/info.h\" #include \"php_icbc.h\" #include \"icbcapi.h\" static int le_icbc; zend_function_entry icbc_functions[] = { PHP_FE(icbc_sign,NULL) PHP_FE(icbc_vsign,NULL) PHP_FE(icbc_getCertID,NULL) {NULL, NULL, NULL} /* Must be the last line in icbc_functions[] */ }; zend_module_entry icbc_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif \"icbc\", icbc_functions, PHP_MINIT(icbc), PHP_MSHUTDOWN(icbc), PHP_RINIT(icbc), /* Replace with NULL if there’s nothing to do at request start */ PHP_RSHUTDOWN(icbc), /* Replace with NULL if there’s nothing to do at request end */ [Page] PHP_MINFO(icbc), #if ZEND_MODULE_API_NO >= 20010901 \"0.1\", /* Replace with version number for your extension */ #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_ICBC ZEND_GET_MODULE(icbc) #endif PHP_MINIT_FUNCTION(icbc) { return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(icbc) { return SUCCESS; } PHP_RINIT_FUNCTION(icbc) { return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(icbc) { return SUCCESS; } PHP_MINFO_FUNCTION(icbc) { php_info_print_table_start(); php_info_print_table_header(2, \"icbc support\", \"enabled\"); php_info_print_table_end(); } PHP_FUNCTION(icbc_sign) { char* src; int srclen; char* pkey; int keylen; char* keypass; int keypasslen; char* signedbuf; int signedbuflen; FILE* fp; char key[2000]; int rcc; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\"sss\",&src,&srclen,&pkey,&keylen,&keypass,&keypasslen) == FAILURE){ return; } fp = fopen(pkey,\"rb\"); if(fp == NULL) { return; } fseek(fp,2,SEEK_SET); fread((void*)key,609,1,fp); fclose(fp); if(rcc = sign(src,srclen,key,607,keypass,&signedbuf,&signedbuflen) >= 0){ base64enc(signedbuf,signedbuflen,&signedbuf,&signedbuflen); src = estrndup(signedbuf,signedbuflen); if(signedbuf != NULL) infosec_free(signedbuf); RETURN_STRING(src,1); [Page] }else{ RETURN_LONG(rcc); } }PHP_FUNCTION(icbc_vsign) { char* src; int srclen; char* cert; int certlen; char* vsignedbuf; int vsignedbuflen; FILE* fp; char vcert[2000]; int rcc; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\"sss\",&src,&srclen,&cert,&certlen,&vsignedbuf,&vsignedbuflen) == FAILURE){ return; } fp = fopen(cert,\"rb\"); if(fp == NULL) { return; } fread((void*)vcert,1525,1,fp); fclose(fp); base64dec(vsignedbuf,vsignedbuflen,&vsignedbuf,&vsignedbuflen); if(rcc = verifySign(src,srclen,vcert,1525,vsignedbuf,vsignedbuflen) >= 0){ if(vsignedbuf != NULL) infosec_free(vsignedbuf); RETURN_TRUE; }else{ if(vsignedbuf != NULL) infosec_free(vsignedbuf); RETURN_LONG(rcc); } } PHP_FUNCTION(icbc_getCertID) { char* arg; char* certid; int arg_len,certidlen; FILE* fp; char cert[2000]; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\"s\", &arg,&arg_len) == FAILURE){ return; } fp = fopen(arg,\"rb\"); if(fp == NULL) { return; } fread((void*)cert,1525,1,fp); fclose(fp); [Page] if(!getCertID(cert,1525,&certid,&certidlen)) { arg = estrndup(certid,certidlen); if(certid != NULL) infosec_free(certid); RETURN_STRING(arg,1); }else{ return; } } 先在zend_function_entry icbc_functions[]数组中放入我们的要实现的函数名,然后是一堆php各个状态入口函数,详情请看Zend的教程。最后是在PHP_FUNCTION宏定义中放我们声明函数的具体实现。具体实现时难点也就是参数的传入和结果传出,还好PHP已经为我们做了很好的抽象。在Zend的教程中也有详尽的说明,俺就不啰嗦了。关键代码照搬icbc的test.c就行了。 5.编译安装我们的库 先将ICBC的头文件考到当前目录,重命名为icbcapi.php,将静态库也cp过来,重命名为*nix的标准形式libicbcapi.a,然后运行 phpize 生成configure,运行 ./configure --enable-icbc 生成Makefile,这里有一个很搞的地方,在生成的Makefile中最后一句中指定ICBC静态库的地方错了,正确的应该是(红色标记地方): $(LIBTOOL) --mode=link $(CC) $(COMMON_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) -o $@ -export-dynamic -avoid-version -prefer-pic -module -rpath $(phplibdir) $(EXTRA_LDFLAGS) $(shared_objects_icbc) $(ICBCAPI_SHARED_LIBADD) 改好Makefile后就可以执行 make 如果一切顺利的话会在modules中得到我们的icbc.so,将我们的icbc.so拷贝到/usr/local/lib/php/extensions目录下,然后在php.ini中确认extensions_dir的值是/usr/local/lib/php/extensions,然后加入这句话 extension=icbc.so 重启apache后,就可以在php中直接调用这三个函数了 6.测试程序,要将测试的证书和key文件放到php测试文件的当前目录 \"; $b64sdata = icbc_sign($src,$key,$passwd); echo \"The string \".$src.\" encrypt by icbc api is \".$b64sdata.\"(base64 encoded)
\"; echo \"Now we check it weather is correct....
\"; if(icbc_vsign(\"zzz\",$cert,$b64sdata)){ echo \"The signtrue to \".$src.\" is right!!
\"; [Page] }else{ echo \"The signtrue to \".$src.\" is wrong!!
\"; exit(); } ?>

28,409

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧