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 寻址,密码,服务器代理等。 |
关键词: 在 .NET 中运用 WEB SERVICE 的CallBacks机制 (5)