在 .NET 中使用 WEB SERVICE 的CallBacks機制 (5)
2024-07-10 13:01:43
供稿:網友
3. web form
對于webservice”a”我們使用的瀏覽器作為客戶端。 每個 web methods有自己的按鈕觸發事件,在棧(stack)中來保存session類的狀態。 頁面的更新基于下面的機制:事件處理程序把數據壓到session棧,在page_load時提取出來并且插入到listbox control中。另一個議題是以異步方式調用dosomeworka方法,它可以產生和處理callback,這就是我們為什么能送另一個請求給webservice”a”的原因。注意每項工作都被它的驗證票據id所識別。
namespace webformcallbackws
{
public class webform1 : system.web.ui.page
{
// ...
protected servicea sa = new servicea();
public webform1()
{
page.init += new system.eventhandler(page_init);
}
private void page_load(object sender, system.eventargs e)
{
if(ispostback == false)
{
//initialize controls, one time!
if(session["status"] == null)
session["status"] = stack.synchronized(new stack());
}
else
{
stack stack = session["status"] as stack;
while(stack.count > 0)
listboxcallbackstatus.items.add(stack.pop().tostring());
int numberofitems = listboxcallbackstatus.items.count;
if(numberofitems > 13)
listboxcallbackstatus.selectedindex = numberofitems - 13;
}
}
private void page_init(object sender, eventargs e)
{
// ...
}
#region web form designer generated code
private void initializecomponent()
{
// ...
}
#endregion
// call the web service asynchronously
private void buttondosomeworka_click(object sender, system.eventargs e)
{
int count = convert.toint32(textboxcount.text);
string ticket = textboxticketid.text;
//
asynccallback callback = new asynccallback(callbackdosomeworka);
iasyncresult ar = sa.begindosomeworka(count, ticket, callback, null);
listboxcallbackstatus.items.add(string.format("#{0} start ...",
ticket));
}
// the call callback from the webservice
private void callbackdosomeworka(iasyncresult ar)
{
string retval = sa.enddosomeworka(ar);
stack stack = session["status"] as stack;
stack.push(retval);
}
// call the web service
private void buttonabort_click(object sender, system.eventargs e)
{
stack stack = session["status"] as stack;
stack.push(sa.abortworka(textboxticketid.text));
}
// get the status from the web service
private void buttonrefresh_click(object sender, system.eventargs e)
{
stack stack = session["status"] as stack;
stack.push(sa.getstatusworka(textboxticketid.text));
}
// clean-up the listbox
private void buttonclear_click(object sender, system.eventargs e)
{
listboxcallbackstatus.items.clear();
}
}
}
ok,我們現在開始做過測試。上述的照片顯示了web 形式的用戶界面。 首先,確定你網絡聯機并且處于企業內部局域網絡。 在 dosomework 按鈕上的單擊,然后請求狀態結果。status 和abort按鈕可以在容易時間點擊。 listbox 控件將會顯示某個工作的當前狀態 (由驗證票據得到)
結論:
使用應用程序模型的 web service開創了分布式架構的一個新紀元。在企業化模型層次結構中使用.net framework動態的調用web methods是簡單的,很直接的。這篇文章說明它如何使用 c#語言來實現。 這種解決方案很好的解釋了相關的概念和設計時所設計的問題。如果真正投入到市場,還需要考慮許多因素,如安全設計,完整的 url 尋址,密碼,服務器代理等。