跟 Request 有关的放到后面一起说,先说其他的 5 个。

Application_Init :在每一个 HttpApplication 实例初始化的时候执行。

Application_Disposed :在每一个 HttpApplication 实例被销毁之前执行。

Application_Error :所有没有处理的错误都会导致这个方法的执行。

Application_Start :在程序初始化的时候执行。在 Web 应用程序的生命周期里就执行一次(自动的重新启动算另外一次生命周期),这里只能放一些公用的信息,比如 HttpApplicationState 。

Application_End :应用程序结束时,在最后一个 HttpApplication 销毁之后执行。对应 Application_Start ,在整个生命周期里面也是只执行一次。

下面来看看跟 Request 有关的,首先我们来看看相应的事件执行顺序:

1.       BeginRequest

2.       AuthenticateRequest

3.       AuthorizeRequest

4.       ResolveRequestCache

5.       AcquireRequestState

6.       PreRequestHandlerExecute

7.       PostRequestHandlerExecute

8.       ReleaseRequestState

9.       UpdateRequestCache

10.   EndRequest

另外还有两个:

1.       PreSendRequestHeaders

2.       PreSendRequestContent

这两个事件的顺序是无法确定的,按照 MSDN 的说法,它们随时都可能发生。下面就按这个顺序来解释一下它们在 Global.asax.cs 中相应的事件处理方法的含义。

Application_BeginRequest : BeginRequest 是在收到 Request 时第一个触发的事件,这个方法自然就是第一个执行的了。

Application_AuthenticateRequest :当安全模块已经建立了当前用户的标识后执行。

Application_AuthorizeRequest :当安全模块已经验证了当前用户的授权时执行。

Application_ResolveRequestCache :当 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过处理程序( 页面或者是 WebService )的执行。这样做可以改善网站的性能,这个事件还可以用来判断正文是不是从 Cache 中得到的。

Application_AcquireRequestState :当 ASP.NET 获取当前请求所关联的当前状态(如 Session )时执行(真是拗口啊, msdn 上就这样写的,我自己想不出什么好句子了)。

Application_PreRequestHandlerExecute :当 ASP.Net 即将把请求发送到处理程序对象(页面或者是 WebService )之前执行。这个时候, Session 就可以用了。

Application_PostRequestHandlerExecute : 当处理程序对象(页面或者是 WebService )工作完成之后执行。

Application_ReleaseRequestState :在 ASP.NET 执行完所有请求处理程序后执行。 ReleaseRequestState 事件将使当前状态数据被保存。

Application_UpdateRequestCache :在 ASP.NET 执行完处理程序后,为了后续的请求而更新响应缓存时执行。

Application_EndRequest :同上, EndRequest 是在响应 Request 时最后一个触发的事件,这个方法自然就是最后一个执行的了。

再说这两个无顺序的

Application_PreSendRequestHeaders :向客户端发送 Http 标头之前执行。

Application_PreSendRequestContent :向客户端发送 Http 正文之前执行。

 

最后就是两个关于 Session 的,这就简单咯

Session_Start :会话开始时执行。

Session_End :会话结束或过期时执行。

其实 Global.asax.cs 中不只可以放这些,其他的实现了 IHttpModule 接口的类所暴露出来的事件都可以使用这样的方式放到这里来。前提是在 Global.asax (或 Web.Config )中有相应的声明。另外, Global.asax 中还可以有很多的花样,但是我没有整理,其实也很简单(更主要的是很多时候不咋用得上), MSDN 里面有详细的介绍,大家可以查一下,我觉得最有用的就数那个 object 标记了, ^_^

posted @ 2009-07-01 16:55 遥望星空 阅读(7) | 评论 (0)编辑

HttpApplication 类的实例(Global继承自该类)是在 ASP.NET 基础结构中创建的,而不是由用户直接创建的。HttpApplication 类的一个实例在其生存期内被用于处理多个请求,但它一次只能处理一个请求。这样,成员变量才可用于存储针对每个请求的数据。

       应用程序按照以下顺序执行由 global.asax 文件中定义的模块或用户代码处理的事件:

BeginRequest(在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生)

AuthenticateRequest (当安全模块已建立用户标识时发生。注:AuthenticateRequest 事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。预订 AuthenticateRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证。)

PostAuthenticateRequest (注意:该事件在 .NET Framework 2.0 版中是新增的。 当安全模块已建立用户标识时发生。PostAuthenticateRequest 事件在 AuthenticateRequest 事件发生之后引发。预订 PostAuthenticateRequest 事件的功能可以访问由 PostAuthenticateRequest 处理的任何数据。)

AuthorizeRequest (当安全模块已验证用户授权时发生。AuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权。)

PostAuthorizeRequest (.NET 2.0里新增的事件。在当前请求的用户已获授权时发生。PostAuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订PostAuthorizeRequest 事件可确保在处理附加的模块或处理程序之前对请求进行身份验证和授权。)

ResolveRequestCache (当 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过事件处理程序(例如某个页或 XML Web services)的执行。)

PostResolveRequestCache (在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。)在 PostResolveRequestCache 事件之后、PostMapRequestHandler 事件之前创建一个事件处理程序(对应于请求 URL 的页)。

PostMapRequestHandler

AcquireRequestState

PostAcquireRequestState

PreRequestHandlerExecute(执行事件处理程序。)

PostRequestHandlerExecute

ReleaseRequestState

PostReleaseRequestState (在PostReleaseRequestState 事件之后,响应筛选器(如果有)将对输出进行筛选。)

UpdateRequestCache

PostUpdateRequestCache

EndRequest

 

posted @ 2009-07-01 16:44 遥望星空 阅读(4) | 评论 (0)编辑
安装Sql server2000时经常会碰到这么一个错误:
 “以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机!”
   但是你重新启动了计算机并不一定能解决这个问题。
 
  解决方法如下:
  点击“开始”-“运行”,输入 regedit   打开注册表编辑器,然后依次找到 
“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager”,在其右侧找到名为“PendingFileRenameOperations” 的键,直接删除即可正常安装SqlServer2000。

  如果这样做还不行就是注册表的修改尚未起作用,可以采用以下两种方式让注册表生效。
  方法一:通过按“Ctrl”+“Alt”+“Del”组合键调出“任务管理器”,在“进程”页找到“explorer.exe”并结束该进程,此时你的任务栏会消失。
            在任务管理器的“文件”-“新建任务(运行)”内输入“explorer.exe”,此时任务栏又出现了。继续安装SqlServer2000吧。
 方法二:重新启动计算机然后安装SqlServer2000。
posted @ 2009-06-24 15:37 遥望星空 阅读(2) | 评论 (0)编辑

SqlServer孤立用户解决——"因为该用户存在对象,所以不能删除该用户。”
最近遇到几次,还原数据库后 新建一个登陆用户,为此登陆用户授权访问此数据库时提示“用户已存在”。原因很明显,还原的数据库中存在此用户,但此用户与刚新增的登陆用户(同名)并没关联起来,想删除数据库中相应用户,却删除不了——"因为该用户存在对象,所以不能删除该用户。”比较郁闷。。。

立即网上查了查,原来,这种用户叫孤立用户,且看资料如下:

*************************************************************************************

孤立用户,即某个数据库的用户户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录。

孤立用户的产生一般是一下两种:
1.将备份的数据库在其它机器上还原;
2.重装系统或SQL SERVER之后只还原了用户库

解决方法是使用sp_change_users_login来修复。

sp_change_users_login的用法有三种

用法1:
exec sp_change_users_login 'REPORT'

列出当前数据库的孤立用户

用法2:
exec sp_change_users_login 'AUTO_FIX','用户名'

可以自动将用户名所对应的同名登录添加到syslogins中

用法3:
exec sp_change_users_login 'UPDATE_ONE','用户名','登录名'
将用户名映射为指定的登录名。
 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yezi1305/archive/2008/11/18/3325444.aspx

posted @ 2009-06-19 14:57 遥望星空 阅读(2) | 评论 (0)编辑

经过虚拟机里面每个用户权限的剥离和对比,最后发现必须要USER的读取权限才能访问证书!

posted @ 2009-06-19 02:11 遥望星空 阅读(14) | 评论 (0)编辑

@rem 使用vs2005自动创建的.pfx数字证书默认有效期只有一年,并且“颁发者”、“颁发给”均为当前机器名和当前登陆用户名的组合,其实我们完全可以创建更友好的.pfx数字证书。

@rem 打开Microsoft .NET Framework 的SDK命令提示,按以下步骤操作:

@rem 1、创建一个自我签署的X.509证书(.cer)和一个.pvk私钥文件,用到makecert工具,命令如下:

makecert -r -n "CN=DKSOFT" -b 01/01/2008 -e 01/01/2010 -sv MyKey.pvk MyKey.cer

@rem 按提示设置私钥密码(也可以不使用密码)即可在当前目录生成相关文件

@rem 2、利用X.509证书(.cer)创建发行者证书 (.spc),用到cert2spc工具,命令如下:

cert2spc MyKey.cer MyKey.spc

@rem 3、从.pvk和.spc格式转换成.pfx格式,用到pvkimprt工具,命令如下:

pvkimprt -pfx MyKey.spc MyKey.pvk

pvkimprt工具下载

posted @ 2009-06-19 01:05 遥望星空 阅读(13) | 评论 (0)编辑

HttpModule执行的顺序取决于web.config配置HttpModule的顺序,而HttpModule中事件的执行先后顺序与asp.net运行机制相关,具体执行顺序如下:

BeginRequest
AuthenticateRequest
AuthorizeRequest
ResolveRequestCache
AcquireRequestState
PreRequestHandlerExecute
PostRequestHandlerExecute
ReleaseRequestState
UpdateRequestCache
EndRequest


此外,有三个不确定的顺序:
PreSendRequestHeaders
PreSendRequestContent
Error

举个例子:
如果你在web.config配置了两个HttpModule,分别是HttpModuleA,HttpModuleB

这个事件执行的顺序如下:
HttpModuleA->BeginRequest
HttpModuleB->BeginRequest
HttpModuleA->AuthenticateRequest
HttpModuleB->AuthenticateRequest
HttpModuleA->AuthorizeRequest
HttpModuleB->AuthorizeRequest
...以此类推 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/flashlm/archive/2008/01/19/2053387.aspx

posted @ 2009-06-18 16:58 遥望星空 阅读(9) | 评论 (0)编辑

使用Visual Studio 2005(Visual Studio 2008亦存在此问题)调试设置了主机头的网站时出现如下错误信息:

---------------------------
Microsoft Visual Studio
---------------------------
无法在 Web 服务器上启动调试。与 Web 服务器通信时出现身份验证错误。请参阅“帮助”以协助解决问题。
---------------------------

项目属性的Web中设置“项目URL”为 http://www.msdi.cn/MultiWeb

如果将“项目URL”指定为 localhost 则在设置时不会出现以上的错误,所以排除了网上绝大部分文章提供的“集成Windows身份验证”,项目属性中“启用调试”的解决方案。

真正的解决方法如下:

步骤 1: 禁用环回检查
请遵循以下步骤:
1. 打开注册表编辑器(单击 开始 , 单击 运行 , 类型 regedit然后单击 确定 )。
2. 中注册表编辑器, 找到并单击以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
3. 右击 Lsa , 指向 新建 , 然后单击 DWORD 值 。
4. 类型 DisableLoopbackCheck然后按 Enter。
5. 右击 DisableLoopbackCheck , 然后单击 修改 。
6. 在 数值数据 框中, 键入 1然后单击 确定 。
7. 退出注册表编辑器, 并重新启动计算机。 (可以不重启计算机)


步骤 2: 指定主机名
要指定主机名, 映射到环回地址并可连接到 Web 站点上, 请按照下列步骤:
1. 打开注册表编辑器(单击 开始 , 单击 运行 , 类型 regedit然后单击 确定 )。  。
2. 中注册表编辑器, 找到并单击以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
3. 右击 MSV1_0 , 指向 新建 , 然后再单击 多字符串值 。
4. 类型 BackConnectionHostNames然后按 Enter。
5. 右击 BackConnectionHostNames , 然后单击 修改 。
6. 在 数值数据 框中, 键入主机名或主机名为站点所在的本地计算机名称,  确定 。
7. 退出注册表编辑器, 并重新启动 IISAdmin 服务。

这个错误的信息只会出现在特定环境的计算机中:This issue only appears on Web Sites configured with a host header on machines with IIS 6 or IIS 5.1 and the RTM version of the .Net Framework 3.5 SP1.

参考文章:
当您浏览位置 IIS 5.1 或 IIS 6 上的网站并且使用集成身份验证时,会收到 401.1 错误
Debugging A Web Site With A Host Header

posted @ 2009-06-18 14:50 遥望星空 阅读(8) | 评论 (0)编辑
为了书写方便,这两个例子没有采用codebehind方式,复制即可运行

第一个例子是当取消或选中节点选中状态时,子节点也做相应的取消或选中变化
需要注意的是如果要初始设置TreeNode为选中状态,只能在客户端设置。如果在服务器端设置TreeNode为选中状态,则在客户端使用getAttribute("Checked"),得到的值永远是true。

<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<HTML>
<HEAD>
<script language="C#" runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
TreeView1.Attributes.Add("oncheck","tree_oncheck(this)");
}
</script>
<script language="javascript">
<!--
//初始化选中节点
function initchecknode()
{
var node=TreeView1.getTreeNode("1");
node.setAttribute("Checked","true");
setcheck(node,"true");
FindCheckedFromNode(TreeView1);
}
//oncheck事件
function tree_oncheck(tree)
{
var node=tree.getTreeNode(tree.clickedNodeIndex);
var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");
setcheck(node,Pchecked);
document.all.checked.value="";
document.all.unchecked.value="";
FindCheckedFromNode(TreeView1);
}
//设置子节点选中
function setcheck(node,Pc)
{
var i;
var ChildNode=new Array();
ChildNode=node.getChildren();

if(parseInt(ChildNode.length)==0)
return;
else
{
for(i=0;i<ChildNode.length;i++)
{
var cNode;
cNode=ChildNode[i];
if(parseInt(cNode.getChildren().length)!=0)
setcheck(cNode,Pc);
cNode.setAttribute("Checked",Pc);
}
}
}
//获取所有节点状态
function FindCheckedFromNode(node) {
var i = 0;
var nodes = new Array();
nodes = node.getChildren();

for (i = 0; i < nodes.length; i++) {
var cNode;
cNode=nodes[i];
if (cNode.getAttribute("Checked"))
AddChecked(cNode);
else
AddUnChecked(cNode);

if (parseInt(cNode.getChildren().length) != 0 ) {
FindCheckedFromNode(cNode);
}
}
}
//添加选中节点
function AddChecked(node) {
document.all.checked.value += node.getAttribute("NodeData");
document.all.checked.value += ',';
}
//添加未选中节点
function AddUnChecked(node) {
document.all.unchecked.value += node.getAttribute("NodeData");
document.all.unchecked.value += ',';
}
//-->
</script>
</HEAD>
<body onload="initchecknode()">
<iewc:TreeView id="TreeView1" runat="server" ExpandLevel="5">
<iewc:TreeNode NodeData="0" CheckBox="True" Text="Node0" Expanded="True">
<iewc:TreeNode NodeData="1" CheckBox="True" Text="Node1" Expanded="True"></iewc:TreeNode>
<iewc:TreeNode NodeData="2" CheckBox="True" Text="Node2" Expanded="True">
<iewc:TreeNode NodeData="3" CheckBox="True" Text="Node3" Expanded="True">
<iewc:TreeNode NodeData="4" CheckBox="True" Text="Node4"

Expanded="True"></iewc:TreeNode>
</iewc:TreeNode>
</iewc:TreeNode>
</iewc:TreeNode>
<iewc:TreeNode NodeData="5" CheckBox="True" Text="Node5" Expanded="True">
<iewc:TreeNode NodeData="6" CheckBox="True" Text="Node6" Expanded="True"></iewc:TreeNode>
</iewc:TreeNode>
<iewc:TreeNode NodeData="7" CheckBox="True" Text="Node7" Expanded="True">
<iewc:TreeNode NodeData="8" CheckBox="True" Text="Node8" Expanded="True">
<iewc:TreeNode NodeData="9" CheckBox="True" Text="Node9"

Expanded="True"></iewc:TreeNode>
</iewc:TreeNode>
</iewc:TreeNode>
</iewc:TreeView><P>
<TABLE id="Table1" cellSpacing="1" cellPadding="1" width="300" border="1">
<TR>
<TD>
<asp:Label id="Label1" runat="server">checked</asp:Label></TD>
<TD>
<INPUT id="checked" type="text" size="32"></TD>
</TR>
<TR>
<TD>
<asp:Label id="Label2" runat="server">unchecked</asp:Label></TD>
<TD><INPUT id="unchecked" type="text" size="32"></TD>
</TR>
</TABLE>
<br>
</P>
</body>
</HTML>



第二个例子是关于如何在服务器端得到客户端设置后的节点选中状态

<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls,

Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<HTML>
<HEAD>
<script language="C#" runat="server">
private void Button1_Click(object sender, System.EventArgs e)
{
Response.Write(TreeView1.Nodes[0].Checked);
}
</script>
<script language="javascript">
function set_check()
{
var nodeindex = "0";
var node=TreeView1.getTreeNode(nodeindex);
node.setAttribute("Checked","True");
TreeView1.queueEvent('oncheck', nodeindex);
}
</script>
</HEAD>
<body>
<form id="TestTree" method="post" runat="server">
<iewc:TreeView id="TreeView1" runat="server">
<iewc:TreeNode CheckBox="True" Text="Node0"></iewc:TreeNode>
</iewc:TreeView>
<br>
<input type="button" value="set check" onclick="set_check()">
<br>
<asp:Button id="Button1" runat="server" Text="submit" OnClick="Button1_Click"></asp:Button>
</form>
</body>
</HTML>
posted @ 2009-06-05 11:43 遥望星空 阅读(21) | 评论 (0)编辑

介绍.NET中动态调用Web Service的相关技术文章。

在.NET中调用Web Service服务(WSDL)有两种可行的方法:
1、通过Web 服务引用,在本地生成所要调用服务的类;(静态方法)
2、通过给定的WSDL服务地址,动态生成Web Service服务类进行服务调用;(动态方法)

由于1中的方法大部分人都会经常用到,因此暂不讨论。

对于2,实现上较为复杂,主要的过程为:
(1)读取WSDL内容到内存中;
(2)根据WSDL内容,动态生成Web Service服务代码;
(3)使用动态编译技术将生成的Web Service服务代码编译为DLL;
(4)通过反射机制实现动态调用。
_________________________________________________________

有关这类技术请参考如下网站:
1、《动态调用 WebService》
地址:http://www.rainsts.net/article.asp?id=304
2、《DynWsLib》
地址:http://www.thinktecture.com/Resources/Software/DynWsLib/default.html
说明:
欧洲一家名位Thinktecture公司发布的开源项目,实现了比较完整的动态调用Web Service的方法,最新版本为1.6,支持.NET 2.0。最可贵的是这是一个完全开源的项目,我们可以下载下来根据实际情况进行一些修改,以适应不同的需求。
3、WSE
地址:http://msdn2.microsoft.com/en-us/webservices/aa740663.aspx
说明:
微软发布的支持Web Service的工具包。目前最新版本为3.0。
_________________________________________________________
Java 与 .NET的互调用
这是本文重点要讨论的话题。
由于项目需要,我们必须为客户提供一个.NET的动态调用Web Service包,以实现对Oracle的BPEL服务器上发布的Web Service进行动态调用。

在使用动态DynWSLib生成的对象进行调用的时候,发现只能够发送一次SOAP,当第二次发送之后,.NET程序会抛出链接已被断开的异常。

这样的错误十分诡异,在网上搜索了之后,发现问题在于BPEL服务器与Microsoft的IIS之间是有区别的,看来微软还是很喜欢搞垄断。

下面说说个人分析的结论,共大家参考:
问题的出现可能和微软的地层支持有关,本人猜测,微软生成的Web Service对象在发送SOAP请求时,建立的HTTP链接在请求发送完成之后,会长时间保持链接状态(即链接没有立即断开),而对于Oracle的Web服务器,当相应SOAP请求之后,会主动断开HTTP链接,这也许就是为什么用微软的东西发送SOAP消息给Oracle服务器,第一次能够成功,第二次就会报链接已断开,发送失败的错误。后面的解决方案中也部分支持了我的这个观点。
________________________________________________________
解决方案:
WSE + HTTP
1、使用WSE构造SOAP请求消息;
2、使用HTTP发送SOAP消息。

下面给出部分参考代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace My.Web.WebService
{
    internal class SoapHttpClient
    {
        private string url = null;

        public SoapHttpClient(string url)
        {
            this.url = url;
        }

        public string RequestResponse(string methodName, string envelope)
        {
            // 用于支持SSL
            ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(OnCheckRemoteCallback);

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Credentials = CredentialCache.DefaultCredentials;

            // 必须设置该值为flase,否则出错
            request.KeepAlive = false;

            request.Method = "POST";
            request.ContentType = "text/xml";
            request.Headers.Add("SOAPAction", methodName);

            UTF8Encoding encoding = new UTF8Encoding();
            byte[] bodyBytes = encoding.GetBytes(envelope);
            request.ContentLength = bodyBytes.Length;
            using (Stream serviceRequestBodyStream = request.GetRequestStream())
            {
                serviceRequestBodyStream.Write(bodyBytes, 0, bodyBytes.Length);
                serviceRequestBodyStream.Close();

                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8))
                    {
                        string result = reader.ReadToEnd();
                        return result;
                    }
                }
            }
        }

        /// <summary>
        /// Using untrusted SSL certificates
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="certificate"></param>
        /// <param name="chain"></param>
        /// <param name="sslPolicyErrors"></param>
        /// <returns></returns>
        private static bool OnCheckRemoteCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }
    }
}

_________________________________________________________
[b]最后讨论一下有关DynWSLib动态调用的问题。[/b]
使用DynWSLib在调用Web Service服务的时候,需要对传入的参数进行适当的处理。

 

private void bnCalc_Click(object sender, System.EventArgs e)
  {
            DynamicWebServiceProxy ws = new DynamicWebServiceProxy();

            ws.EnableMessageAccess = true;
            ws.Wsdl = "http://localhost:3092/CatalogueDataPublishTest.asmx?WSDL";
            //ws.Url = new Uri("http://localhost:3092/CatalogueDataPublishTest.asmx");
            ws.TypeName = "CatalogueDataPublishTest";
            ws.MethodName = "HelloWorld";
           
            //ws.AddParameter(XmlHelper.Object2Xml(new DCMCatalogueWork()));
            //ws.AddParameter(new DCMCatalogueWork());

            AddParameter(ws, "dcw", new Sobey.MAM.Common.InterfaceDataType.DCM2.Catalogue.SystemDefineType());

            object result = ws.InvokeCall();

            MessageBox.Show(result.ToString());
  }

        /// <summary>
        /// 添加WebService类型体系中的参数值
        /// </summary>
        /// <param name="ws">代理</param>
        /// <param name="name">参数名字(WebService中的参数名字,这里也可以是参数位置索引)</param>
        /// <param name="value">参数取值</param>
        public void AddParameter(DynamicWebServiceProxy ws,string name, object value)
        {
            //找到该参数的类型
            Type objType = GetParameterType(ws,name);

            //由于2个对象只是命名空间不同,不能强制转换,就采用序列化与反序列化的方式进行深度拷贝。
            ws.AddParameter(XmlHelper.Xml2Object(XmlHelper.Object2Xml(value), objType));
        }

        /// <summary>
        /// 获取WebService方法指定参数的类型
        /// </summary>
        /// <param name="ws">服务代理</param>
        /// <param name="parameterName">参数名称</param>
        /// <returns></returns>
        private Type GetParameterType(DynamicWebServiceProxy ws,string parameterName)
        {
            Type t = ws.Instance.GetType();
            MethodInfo methodInfo = t.GetMethod(ws.MethodName);

            // 获得方法的参数类型
            ParameterInfo[] param = methodInfo.GetParameters();

            if (param.Length < 1)
            {
                return null;
            }

            foreach (ParameterInfo pi in param)
            {
                if (pi.Name == parameterName)
                {
                    return pi.ParameterType;
                }
            }

            return null;
        }

posted @ 2009-06-03 15:08 遥望星空 阅读(75) | 评论 (0)编辑