WSE2.0 Webservice中事件回调客户端应用程序(callback)

来源:互联网 发布:java 反射 混淆 编辑:程序博客网 时间:2024/05/16 14:20

 源码Service.cs

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections;
using Microsoft.Web.Services2;
using Microsoft.Web.Services2.Messaging;
using Microsoft.Web.Services2.Addressing;

namespace WebService
{
    [System.Web.Services.WebServiceBinding(Name = "RBWebService", ConformsTo = System.Web.Services.WsiProfiles.BasicProfile1_1, EmitConformanceClaims = true), System.Web.Services.Protocols.SoapDocumentService()]
    public class RBWebService : System.Web.Services.WebService
    {        #region WSE 2.0 CallBack
        private ArrayList Listeners
        {
            get
            {
                return (ArrayList)Application["Listeners"];
            }
        }
        /// <summary>
        /// 添加客户端监听程序
        /// </summary>
        /// <param name="listener">要添加的客户端名</param>
        [WebMethod]
        public void AddListener(string listener)
        {
            this.Listeners.Add(listener);
        }
        /// <summary>
        /// 删除监听客户端
        /// </summary>
        /// <param name="listener">要删除的客户端名</param>
        [WebMethod]
        public void RemoveListener(string listener)
        {
            for (int i = 0; i < this.Listeners.Count; i++)
            {
                if (((string)this.Listeners[i]).Equals(listener))
                {
                    this.Listeners.RemoveAt(i);
                    return;
                }
            }
        }
        /// <summary>
        /// 调用监听程序入口
        /// </summary>
        [WebMethod]
        public void FireEvent()
        {
            for (int i = 0; i < this.Listeners.Count; i++)
            {
                SoapEnvelope envelope = new SoapEnvelope();
                envelope.SetBodyObject("blah blah");
                envelope.Context.Addressing.Action = new Action((string)(this.Listeners[i]));
                envelope.Context.Addressing.ReplyTo = new ReplyTo(new System.Uri((string)(this.Listeners[i])));
                SoapSender peerProxy = new SoapSender(new System.Uri((string)(this.Listeners[i])));
                try
                {
                    peerProxy.Send(envelope);
                }
                catch (Exception e)
                {
                    this.Listeners.RemoveAt(i);
                }
            }
        }

        /// <summary>
        /// 获取在线的监听器列表
        /// </summary>
        /// <returns>saop;saop;</returns>
        [WebMethod]
        public string GetListeners()
        {
            string listeners = "";
            foreach (string item in this.Listeners)
            {
                listeners += item + ";";
            }
           return listeners;
       }
        #endregion WSE 2.0 CallBack
   }
}

 

在web.config中添加

<system.web>
  <webServices>
   <soapExtensionTypes>
    <add type="Microsoft.Web.Services2.WebServicesExtension, Microsoft.Web.Services2,Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>
   </soapExtensionTypes>
  </webServices>

</system.web>

在Bin文件夹中添加Microsoft.Web.Services2.dll引用

在winForm中

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Web.Services2.Messaging;
using Microsoft.Web.Services2;

namespace WinApp
{
    public delegate void MessageRecievedHandler(SoapEnvelope envelope);
    public partial class WSECallBack : Form
    {
        public WSECallBack()
        {
            InitializeComponent();
            server.Url = Properties.Settings.Default.WSEWebSericeUrl;//配置webservice的地址
        }
        localhost.RBWebService server = new WinApp.localhost.RBWebService();

        private void btnAdd_Click(object sender, EventArgs e)
        {
            server.AddListener(this.myUri.ToString());
            this.textBoxOutput.Text += "/r/n/r/n" + server.GetListeners();
        }

        private void btnRemove_Click(object sender, EventArgs e)
        {
            server.RemoveListener(this.myUri.ToString());
            this.textBoxOutput.Text += "/r/n/r/n" + server.GetListeners();
        }

        private void btnFire_Click(object sender, EventArgs e)
        {
            server.FireEvent();
        }

        private void btnList_Click(object sender, EventArgs e)
        {
            this.textBoxOutput.Text += "/r/n/r/n" + server.GetListeners();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int port = (new System.Random()).Next(3000, 7000);
            this.Text += "  Listner Port: " + port;
            myUri = new Uri("soap.tcp://" + System.Net.Dns.GetHostName() + ":" + port + "/MyEventListner");
            MyReceiver receiver = new MyReceiver();
            receiver.MessageRecieved += new MessageRecievedHandler(receiver_MessageRecieved);
            SoapReceivers.Add(myUri, receiver);
        }
        System.Uri myUri;
        delegate void Update(TextBox textBox, string message);

        public void UpdateText(TextBox textBox, string message)
        {
            textBoxOutput.Text += "/r/nEvent Recieved";
        }

        void receiver_MessageRecieved(SoapEnvelope envelope)
        {
            if (this.textBoxOutput.InvokeRequired)
                this.textBoxOutput.Invoke(new Update(UpdateText), this.textBoxOutput, "/r/nEvent Recieved");
        }

    }

    public class MyReceiver : SoapReceiver, System.Web.IHttpHandler
    {
        public event MessageRecievedHandler MessageRecieved;

        protected override void Receive(SoapEnvelope envelope)
        {
            OnMessageRecieved(envelope);
        }

        private void OnMessageRecieved(SoapEnvelope envelope)
        {
            if (MessageRecieved != null)
                MessageRecieved(envelope);
        }
    }

}