iT邦幫忙

0

webservice 非同步處理

我有支程式,client端是 windows form,想要上傳一個檔案到我自已寫的 webservice,經過一些處理後,產生檔案再下載到 client端。由於 webservice要做的動作很多,我希望能在client端顯示目前webservice執行的狀況。請問我應該用什麼技術比較好?

我開發的環境是 .net 2.0, visual studio 2005 c#, mssql 2008

我研究了2天, 有看到所謂 callback 的技術,也試過 XXXAsync/XXXCompleted 的寫法。還有所謂 soap extention ,真是愈看愈花。還請各位前輩指點一下方向,謝謝!

10
丁丁 (Dean)
iT邦大師 6 級 ‧ 2011-11-28 11:17:08
最佳解答

建議將 Web Services 分開成兩個部份

  1. 原先應用的 Web Services
  2. 新增 Web Services 監控,這部份請參考下篇 Link
    Monitor your Web Services usage via .NET SOAP Extensions
    http://www.codeproject.com/KB/webservices/MonitorWebServicesUsage.aspx
10
Albert
iT邦高手 1 級 ‧ 2011-11-27 23:57:37

yohun提到:
webservice

SOA

主動服務 session 都已經隔離作業

服務完才丟比較有效率

如果每一動作都要丟回原呼叫的 session

如果 [伺服端] 要服務很久才丟回

可能 [要切割] 服務內容

有哪一種服務是要 [很久]

丟上來的選課資料 [每 3 分鐘] 一次湊合 ?
丟上來的選課資料 [每 3 小時] 一次湊合 ?

Brandon iT邦新手 4 級 ‧ 2011-11-28 10:58:48 檢舉

抱歉,看不太懂。
你是說,Client端的程式,儘量把作業切細,再分別對應到 webService的工作嗎?
我這個作業,有一段是webService處理後,要壓縮檔案,這一段可能會比較久,我希望能知道壓縮的進度。這該如何做呢?

10
pantc328
iT邦研究生 1 級 ‧ 2011-11-28 11:15:55

Client 往 Server 丟
Server 處理時,把處理狀態寫到資料庫或某檔案裡
Client在定時去掃該狀態

這種東西不能寫成非同步的樣式
寫成非同步你的連線會一直存在,浪費系統資源
由於你是Windows Form 程式
你可以開Port去等待通知

如果你是Web 或 手機程式就固定時間去掃吧

Brandon iT邦新手 4 級 ‧ 2011-11-29 00:21:21 檢舉

抱歉,我沒寫過 socket的程式,請問開port等待通知是怎麼樣的做法?

14
sungnoone
iT邦新手 2 級 ‧ 2011-11-28 13:32:44

我的做法是換個角度

  1. 在Client端與Server端中間,有個佇列服務
  2. 佇列服務提供webservice與client及server端通訊
  3. client端傳送要做的工作到佇列中,佇列會回傳工作編號,讓使用者知道我的工單是哪個4. server端由佇列取得順序執行工作,並把工作結果傳回佇列
  4. 佇列有個介面顯示目前工作排序、狀態進度,亦可調整順序或刪除。這部分我比較懶,直接以sharepoint的清單來做,清單的webservice都是現成的。
Brandon iT邦新手 4 級 ‧ 2011-11-29 22:14:56 檢舉

大大的意思是,sharepoint 的清單是websevice,可以用.net 的程式呼叫?
這倒是個我沒想過的作法。可以再說清楚一點嗎?

10
sula3065408
iT邦研究生 1 級 ‧ 2011-11-28 14:10:45

Client polling progress with session ID via ajax. Your web service process any thing you want and store progress with session ID for client take back.

BTW, when I can use AP to transfer file or process some task, I would like to create socket not web service. It will over packaging to effect performance.

M$ always support suits, expansive suits for M$ user so you can take a solution form M$DN, they will tell you what kind product you can pay for.

10
kradark
iT邦好手 1 級 ‧ 2011-11-29 08:14:25

方法很多種,看一下你熟悉的技術:.net 2.0, visual studio 2005 c#, mssql 2008
最簡單的就是寫網頁,用HTTP送一個檔案到主機後,處理後把檔案內容回應回來,或者把URL回應回來。
其次,去抓各ftp daemon來改,client用ftp protocol上傳完一個檔案後,daemon馬上運算一個結果檔再旁邊,client在自己抓下來就ok。
最後,就是自己寫socket,不過要同時起兩個daemon,就先略過。
web service不熟,就留給其他大大說明。

12
swpoker
iT邦新手 5 級 ‧ 2011-11-29 09:29:23

我自己是用java寫的~給你參考一下
1.client 要求產生一個編號 ;server回應一個編號
2.client 發送一個非同步的工作啟動的要求(內有剛獲得的編號);server 開始啟動工作,同時產生工作狀態的物件(內有剛剛的編號),
3.server 在執行每一階段寫入工作狀態物件的訊息
4.client 可用獲得的編號去查詢工作狀態物件現在的狀態為何
在此工作狀態物件所帶有的資料要端看你的定義而定
例如:
1.我是用作業程序的編號去帶入,這樣可以滿足我系統可以離開畫面之後,又回來依然可以看到所以該作業現有的執行的工作狀態
2.如果是用開放的話,那麼就要考慮使用ip+瀏覽器相關資訊(cookies)等作為查詢該工作狀態的依據

因為我本身維護的系統是需要登入才可以的,加上是用作業別來需分,所以我都是用作業編號來作為查詢工作狀態物件的依據,但還是要以實際的需求加以變化,採用這個工作狀態物件的好處就是可以作為不同的作業共同的模組,這樣就別的作業要用的話,直接套進去就可以了

我要發表回答

立即登入回答