精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止任何转载或其它形式的非法合作,侵权必究
ASP.NET Web服务优化不能只考虑服务器端,还要考虑客户端和通信部分等等。
异步invoke意味着会新开线程调用方法,这样让主线程更有能力处理其它事务。异步子线程结束时会通知主线程,如果有要求,也会返回数据。如果是复杂且比较慢的方法,用异步效果更好。
当VS.NET生成Web服务的代理类时,它会自动生成Begin<webmethodname>和End<webmethodname>,下面举例说明。
假设有MyWebService服务和方法 int Sum(int a, int b),此方法返回a+b,代理会包含如下部分:
public System.IAsyncResult BeginSum(int a, int b, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("Sum", new object[] {a, b}, callback, asyncState); } public int EndSum(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); }
下面是异步调用示例:
//webservice instance private MyWebService webService = new MyWebService(); private int result = 0; public void InvokeSum(int a, int b) { //delegating AsyncCallback asyncCallback = new AsyncCallback(FinishSum); //start executing a web method //Sum in a separate thread webService.BeginSum(a, b, asyncCallback, null); } //this callback method is invoked //when a web method has finished working public void FinishSum(IAsyncResult iAsyncResult) { //get the result this.result = webService.EndSum(iAsyncResult); }
大家都知道,服务器端第一次执行比后续执行慢,这通过观察输出窗口就可以知晓,以Debug模式打开项目,运行后看输出窗口,一旦一个方法激活,程序会加载几个库,比如:System.Web.dll、System.Web.Services.dll和System.XML.dll等等,也许还有你自己代码写的库。这个加载过程会占用时间,所以在程序启动时提前创建Web服务实例,这会加载库就自然节省时间了。
非匿名情况下可以使用本节的技巧,SoapHttpClientProtocol 是Web服务代理的基类,这个类有PreAuthenticate 属性,MSDN里是这样描述这个属性:
当PreAuthenticate 为真时,当认证机制支持时,首次请求发包会发送WWW-authenticate header。当它为假时,请求初始状态不会验证用户,如果是匿名,则方法执行,否则是401错误,客户端WebClientProtocol 随即回复认证证书给服务器,如果认证通过,方法可执行,否则不执行。
不过要记住,不是所有认证方法都支持PreAuthenticate,如果IIS服务器使用Windows Integrated Authentication,提前认证不可能用上。为了加速Web服务方法调用,使用“基本”验证方案,不过记住,“基本”方案有代价,只用于SSL保护模式。