none
Winform和webform的区别?!对象为什么为空? RRS feed

  • 问题

  •  



    我是从winform才转到搞web的,基础不好。不知如何描述更清晰。干脆说明要作的事吧。

    要作的是呼叫中心,服务器上有第三方(A公司)的呼叫中心核心软件,客户端(座席人员-就是接电话的人)也已经有A公司提供的winform应用程序,可以接听和管理来电。但这些全是winform的程序。

    现在,要用这A公司开放的API,作一套web版的。

     

    以下是我写的测试代码,在winform中可以正常的使用

    BWK_CallControl.Dial(textBox4.Text);

    对textbox中的电话号码进行拨打。

     

    而在web application中,却出错了:

    在Button1_Click方法中,BWK_CallControl对象是被赋予了实例的,在debug时,可以看到,可到Button2_Click方法中时,BWK_CallControl在debug时,可以看到为null。

     

     

    这是winform中的代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using AltiComLib;

    namespace bwkCallDial
    {
        public partial class Form1 : Form
        {
            private AltiComLib.IAAccess BWK_Access = null;
            private AltiComLib.ASessionClass BWK_Session = null;
            private AltiComLib.IACallControl BWK_CallControl = null;
            private AltiComLib.IACall BWK_Call = null;
            private AltiComLib.IALine BWK_Line = null;
            private AltiComLib.IACall BWK_ACall = null;
            private string strNum = null;
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                BWK_Access = new AAccess();

                //String strServer = TextBox1.Text;//strServer为主机名或IP 地址
                //String strExt = TextBox2.Text;
                //String strPswd = TextBox3.Text;

                //BWK_ACall.MyNum

                try
                {
                    // Connect to server
                    BWK_Access.Connect(textBox1.Text);

                    // Logon a extension
                    BWK_Session = (AltiComLib.ASessionClass)BWK_Access.Logon(textBox2.Text, textBox3.Text, A_LOGON_TYPE.A_LOGON_TYPE_EXT);

                    BWK_Line = BWK_Session.MyLine;

                    BWK_CallControl = (IACallControl)BWK_Session.GetServiceObj(AltiComLib.A_SERVICE_TYPE.A_SERVICE_CALLCONTROL);

                   
                }
                catch (Exception ex)
                {
                    label1.Text+= "Logon Failed. The information is: " + ex.Message;
                   
                }

            }

            private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    if (BWK_CallControl != null)
                    {
                        BWK_CallControl.Dial(textBox4.Text);

                        label1.Text+= "拨打成功!";
                    }
                   


                }
                catch (Exception ex)
                {
                   
                    label1.Text += "拨打失败!" + ex.Message;
                }
            }
        }
    }

     

    以下是web application中的代码:

     

    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using AltiComLib;

    namespace CallDial
    {
        public partial class _Default : System.Web.UI.Page
        {
            private AltiComLib.IAAccess BWK_Access = null;
            private AltiComLib.ASessionClass BWK_Session = null;
            private AltiComLib.IACallControl BWK_CallControl = null;
            private AltiComLib.IACall BWK_Call = null;
            private AltiComLib.IALine BWK_Line = null;
            private AltiComLib.IACall BWK_ACall = null;

            protected void Page_Load(object sender, EventArgs e)
            {

            }

            protected void Button1_Click(object sender, EventArgs e)
            {
                BWK_Access = new AAccess();


                try
                {
                    // Connect to server
                    BWK_Access.Connect(TextBox1.Text);

                    // Logon a extension
                    BWK_Session = (AltiComLib.ASessionClass)BWK_Access.Logon(TextBox2.Text, TextBox3.Text, A_LOGON_TYPE.A_LOGON_TYPE_EXT);

                    BWK_Line = BWK_Session.MyLine;

                    BWK_CallControl = (IACallControl)BWK_Session.GetServiceObj(AltiComLib.A_SERVICE_TYPE.A_SERVICE_CALLCONTROL);


                }
                catch (Exception ex)
                {
                    Label1.Text += "Logon Failed. The information is: " + ex.Message;

                }

            }

            protected void Button2_Click(object sender, EventArgs e)
            {
                try
                {
                    if (BWK_CallControl != null)
                    {
                        BWK_CallControl.Dial(TextBox4.Text);

                        Label1.Text += "拨打成功!";
                    }

     

                }
                catch (Exception ex)
                {

                    Label1.Text += "拨打失败!" + ex.Message;
                }
            }
        }
    }

     

     

    AltiComLib是这个第三方(A公司)为呼叫中心进行二次开发提供的DLL,也有SDK资料。也有C#版的winform sample,但老板要求作成B/S架构,要全在IE中实现座席人员对电话的接听、拨打、管理等操作。但像以上简单的代码在web application中也不能正常执行,请给出个能说服老板的理由,谢谢。

    我也多次就此问题与老板沟通,但总是无法有详细的资料来支持我的观点,我的观点就是除非用ACTIVEX,不然, 无法实现控制电话的功能,

     

    可老板也有技术上的支持,他的观点是:BWK_CallControl 在客户端发出登录请求,并发送服务器名,分机名以及分机密码到服务器后,在服务器端这个BWK_CallControl 对象就存在了,以后,要拨打电话,只要客户端再发送一个电话号码过去,就可以利用BWK_CallControl.Dial(电话号码)实现拨打指定的电话了。

     

    还请大家能为此引经据典,能说明白这其中的问题。再次感谢!

    2008年12月21日 12:05

答案

  •  

    winform的操作都是在客户端一端进行的,你定义的变量BWK_CallControl不会因为Button1.Click和 Button2.Click操作巍峨改变状态。里面的对象会一直保留,

    webform的ui和执行是在客户端和服务器端两个不同的端点,客户端需要提交到服务器才能执行具体的操作,而每次不同的提交都不会保留状态,因此,Button2.Click你需要重新实例化你的BWK_CallControl

    2008年12月21日 12:29
    版主

全部回复

  •  

    winform的操作都是在客户端一端进行的,你定义的变量BWK_CallControl不会因为Button1.Click和 Button2.Click操作巍峨改变状态。里面的对象会一直保留,

    webform的ui和执行是在客户端和服务器端两个不同的端点,客户端需要提交到服务器才能执行具体的操作,而每次不同的提交都不会保留状态,因此,Button2.Click你需要重新实例化你的BWK_CallControl

    2008年12月21日 12:29
    版主
  •  

    首先谢谢您的解答,BWK_CallControl对象在服务器端还存在吗?如果还存在,那第二次可以再去找到这个已经保留有登录状态和相关的信息的对象吗?找到这个登录后的对象,再将使用它,不再重新登录了。可以吗?是否可以用WEB application来作这个电话控制的开发?
    2008年12月21日 12:57
  • Button1.Click和Button2.Click是两次操作,除非自己保存,Button1.Click的BWK_CallControl对象和Button2.Click的BWK_CallControl对象是不同的,另外,B/S程序都是多用户同时操作的,与你的 Winform只有一人操作是不同的,你要了解下B/S的运行机制

    2008年12月21日 13:02
    版主
  •  

    BWK_CallControl对象中不只有字符串,还有其他类型的的数据,比如:实时的通话线路之类 的,这简直不知道怎么保存,这种情况 下是不是只有用winform来作,作成c/s架构?谢谢
    2008年12月22日 1:56
  • 我觉得是啊。服务器上的语音也不能直接传到客户端啊。如果想直接在页面上进行通话,必须使用插件做,跟winform差不多了,还不如使用winform方便,呼叫中心具体不是很了解,不知道你做的是不是这样的东西。

    数据管理可以放在web上,具体通话比较困难



    2008年12月22日 3:17
    版主