客戶端訪問Web Service方法的乙個細節

2021-09-05 16:45:24 字數 2198 閱讀 6494

之前遇到乙個要求,需要能夠取消乙個正在進行中的web service。這也是我第一次遇到這個功能,不過不難,我想。既然asp.net ajax的客戶端與伺服器端通訊完全通過microsoft ajax library的非同步通訊層進行,那麼我們只要得到正在請求web service的sys.net.webrequest物件,呼叫其abort方法就可以了。但是究竟應該如何得到這個物件呢?於是我粗略地閱讀了一下**。

首先假設有如下的web service方法定義(demoservice.asmx):

[scriptservice]

public

class demoservice : system.web.services.webservice

}

訪問demoservice.asmx/jsdebug(或者將其使用scriptmanager引用到頁面中之後)就能夠得到如下的**(片斷、經過排版)類。

var demoservice = function()

demoservice.prototype =

, succeededcallback,

failedcallback,

usercontext);

}}demoservice.registerclass('demoservice',sys.net.webserviceproxy);

...

顯然,這個**類繼承了sys.net.webserviceproxy類,於是我就把目光轉向了其中的_invoke方法:

function sys$net$webserviceproxy$_invoke(

servicepath, methodname, useget, params, onsuccess, onfailure, usercontext)

這下又將操作委託給了sys.net.webserviceproxy.invoke靜態方法,繼續看**:

sys.net.webserviceproxy.invoke = function sys$net$webserviceproxy$invoke(

servicepath, methodname, useget, params, onsuccess, onfailure, usercontext, timeout)

return request;

}

嗨,這不就是我所需要的sys.net.webrequest物件嗎?原來想要得到這個物件那麼簡單,於是我就寫下了下面的**:

var request = demoservice.demomethod(oncomplete);

然後在必要時:

request.abort();

執行,出現了錯誤:request為undefined,為什麼demomethod方法呼叫沒有返回request物件?跟蹤了**之後,不大不小地暈了一下,原來問題出在這裡:

demoservice._staticinstance = new demoservice();

...demoservice.demomethod = function(onsuccess,onfailed,usercontext)

雖然早就知道web service**會在類上建立乙個singleton物件,並且建立靜態方法再委託給那個例項上的相應方法,卻一直沒有意識到這個細節。在上面的靜態方法中,居然是直接呼叫了demomethod方法,卻沒有將結果返回出來,真讓我哭笑不得了一下。

不過問題時非常容易解決的,只要使用如下的方式在客戶端呼叫webservice方法就可以了:

var request = demoservice._staticinstance.demomethod(oncomplete);

不過這個做法似乎……有些奇怪?那麼您也可以這樣:

var demoservice = new demoservice();

var request = demoservice.demomethod(oncomplete);

在這裡,重新建立乙個demoservice物件似乎有些多餘,不過在某些時候也是非常有用的做法。例如,您需要將操作分為兩類,一類的超時時間為5秒,而另一類為10秒,因此您就可以建立兩個**物件,分別設定不同的超時時間。因為超時時間我們只能在service的級別上設定,而不能在呼叫方法時指定。

webservice客戶端超時

使用axis2生成webserice客戶端時,在引用的jar包axis2 kernel下的org.apache.axis2.client.options類中預設設定通訊超時時間為30s,jar包原始碼如下,可以看到預設時間為final常量 package org.apache.axis2.clien...

Redis客戶端訪問

在nignx和mybatis文章相關案例中都使用到了redis,使用過程中都是直接匯入redis相關的jar後進行ip port的配置就可以訪問了 mybatis功能點一應用 二級快取整合redis 池塘裡洗澡的鴨子 cnblogs.com 使用過程中並不需要關注訪問介面等,而本文從redis的視角...

客戶端呼叫服務端webservice的埠問題

今天有乙個同事過來問 他有乙個程式在a伺服器上調第三方b伺服器簡訊傳送服務介面 webservice 無論是否傳送成功,服務介面都會返回狀態。現在客戶要做每乙個伺服器 做入站埠管控,一切不必要的埠都要禁掉,問這邊需要開放哪些入站埠,前提不要影響簡訊的傳送和狀態返回。同事說連線時己方的產生的埠號是隨機...