Открытие / закрытие соединения с базой данных на странице apsx для системы IVR - PullRequest
0 голосов
/ 16 июня 2011

Я сейчас занимаюсь разработкой системы IVR, мой вопрос больше касается разработки базовой архитектуры и открытия / закрытия соединения с базой данных. Как вы можете видеть из кода ниже, в page_load я открываю соединение, передаю переменные, а затем закрываю соединение. Моя проблема заключается в том, что переменные не устанавливаются во время загрузки страницы, они устанавливаются при входящем вызове, который находится в разделе Boolean ParseXML. Мне нужно знать, как лучше всего открыть соединение во время загрузки страницы, передать переменные после их сбора и, наконец, закрыть соединение. И самое главное, как это сделать, я попробовал несколько разных методов, но безуспешно.

Мой первоначальный мыслительный процесс и подход состоит в том, чтобы разделить код подключения к базе данных и поместить их в разные части жизненного цикла страницы. Но у меня был нулевой успех с тем, где именно это поставить.

Логический анализ, запись в текстовый файл. Но я хочу, чтобы он также записывал в базу данных.

<%@ Page Language="C#" aspcompat="true" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Web.SessionState" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="System.Web.UI.HtmlControls" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Data" %>



   <script language="C#" runat="server">


       Boolean ParseXML(string XMLContent)
       {
           try
           {
               XmlDocument doc = new XmlDocument();
               doc.LoadXml(XMLContent);

               String MenuID, Duration, CallerID, CallID, DateAndTime, VoiceFileName;
               XmlNode TempNode;
               Byte[] VoiceFile;

               XmlElement root = doc.DocumentElement;
               XmlAttributeCollection attrColl = root.Attributes;

               //parse inbound values
               MenuID = attrColl["menuid"].Value;
               Duration = attrColl["duration"].Value;
               CallID = attrColl["callid"].Value;
               CallerID = attrColl["callerid"].Value;

               //writed parsed values to file
               StreamWriter w = File.AppendText(Request.MapPath("summaryincall.txt"));

               w.Write(String.Format("\"{0:MM/dd/yyyy}\",\"{0:HH:mm:ss}\"", DateTime.Now));

               XmlNodeList NodeCount = doc.SelectNodes("/campaign/prompts/prompt");
               foreach (XmlNode node in NodeCount)
               {
                   attrColl = node.Attributes;

                  w.WriteLine("Prompt ID: " + attrColl["promptid"].Value);
                  w.WriteLine("Keypress : " + attrColl["keypress"].Value);
                  w.Write(attrColl["keypress"].Value);


                   if (node.HasChildNodes)
                   {
                       TempNode = node.FirstChild;
                       attrColl = TempNode.Attributes;

                       //convert file to binary
                       VoiceFile = System.Convert.FromBase64String(TempNode.InnerText);
                       VoiceFileName = attrColl["filename"].Value;

                       //save file in application path
                       FileStream fs = new FileStream(Request.MapPath(VoiceFileName), FileMode.OpenOrCreate);
                       BinaryWriter bw = new BinaryWriter(fs);
                       bw.Write((byte[])VoiceFile);
                       bw.Close();
                       fs.Close();

                       w.WriteLine("Filename : " + VoiceFileName);
                   }
               }


               w.Close();
               return true;
           }
           catch (Exception e)
           {
               Response.Write(e.Message);
               return false;

           }
       }


       void Page_Load(object sender, System.EventArgs e)
       {

           string connectionString = "server=abc;database=abc;uid=abc;pwd=1234";
           SqlConnection mySqlConnection = new SqlConnection(connectionString);
           string procedureString = "Call_Import";
           SqlCommand mySqlCommand = mySqlConnection.CreateCommand();
           mySqlCommand.CommandText = procedureString;
           mySqlCommand.CommandType = CommandType.StoredProcedure;
           mySqlCommand.Parameters.Add("@CDate", SqlDbType.DateTime).Value = DateTime.Now;
           mySqlCommand.Parameters.Add("@CTime", SqlDbType.DateTime).Value = DateTime.Now;
           mySqlCommand.Parameters.Add("@ID", SqlDbType.Int).Value = keypress;
           mySqlCommand.Parameters.Add("@CType", SqlDbType.Int).Value = CallID;
           mySqlConnection.Open();
           mySqlCommand.ExecuteNonQuery();
           SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter();
           mySqlDataAdapter.SelectCommand = mySqlCommand;
           mySqlConnection.Close();


           try
          {
             String xmlcontent, PostResponse, campaign;
             Byte[] Bindata = Request.BinaryRead(Request.TotalBytes);

             string XML;
             XML = System.Text.Encoding.ASCII.GetString(Bindata);
             StreamWriter w = File.AppendText(Request.MapPath("xmlsummaryincall.txt"));
             w.WriteLine("--- "  + DateTime.Now + " ------------------------------------------------------");
             w.WriteLine(XML.Replace("<?xml version=\"1.0\"?>", ""));  //needed so ?xml tag will display as text
             w.WriteLine("");
             w.WriteLine("");          
             w.Close();

             if (!ParseXML(XML)) Response.Write("Failed");

           }
           catch (Exception error)
           {
             Response.Write(error.Message);
           }
       }

   </script>

Ответы [ 2 ]

0 голосов
/ 17 июня 2011

У меня нет большого опыта IVR, но вот как это работает на одной системе, на которой я работал (которая использовала VXML).

На звонок ответил IVR. Это заставило голосовой браузер IVR выдать HTTP-запрос на веб-сервер.

Веб-сервер получил запрос вместе с номером порта для идентификации уникального абонента. В моем случае мы использовали стандартные страницы ASPX, которые выводят VMXL (а не HTML или XHTML), поэтому вся обработка должна была выполняться в методе Page_Load. Если странице требуется дополнительная информация о вызове, например, номер вызывающего абонента, мы отправим вызов веб-службы в IVR, включая номер порта.

Все взаимодействие пользователя с IVR - нажатия кнопок и т. Д. - обрабатывалось на IVR, и веб-сервер включался только тогда, когда запрашивался другой документ VXML.

0 голосов
/ 16 июня 2011

Я предполагаю, что SqlDataAdapter используется после вызова метода ParseXml.
Попробуйте следующее:

Объявите поле для SqlConnection и SqlCommand.
Откройте соединение в Page_Load.
Установите параметры команды в ParseXml.
Закройте соединение в Page_Unload.

<script language="C#" runat="server">
    private SqlConnection mySqlConnection;
    private SqlCommand mySqlCommand;

    Boolean ParseXml(string XMLContent){

        // Do other work

        mySqlCommand.Parameters["@CDate"].Value = DateTime.Now; 
        mySqlCommand.Parameters["@CTime"].Value = DateTime.Now; 
        mySqlCommand.Parameters["@ID"].Value = keypress; 
        mySqlCommand.Parameters["@CType"].Value = CallID; 

        // Do other work

    }

     void Page_Load(object sender, System.EventArgs e)
     {
        string connectionString = "server=abc;database=abc;uid=abc;pwd=1234"; 
        mySqlConnection = new SqlConnection(connectionString); 
        string procedureString = "Call_Import"; 
        mySqlCommand = mySqlConnection.CreateCommand(); 
        mySqlCommand.CommandText = procedureString; 
        mySqlCommand.CommandType = CommandType.StoredProcedure; 
        mySqlCommand.Parameters.Add(new SqlParameter("@CDate", SqlDbType.DateTime));
        mySqlCommand.Parameters.Add(new SqlParameter("@CTime", SqlDbType.DateTime));
        mySqlCommand.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int));
        mySqlCommand.Parameters.Add(new SqlParameter("@CType", SqlDbType.Int));
        mySqlConnection.Open(); 
        SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(); 
        mySqlDataAdapter.SelectCommand = mySqlCommand;
     }

     void Page_UnLoad(object sender, System.EventArgs e){
        if (mySqlConnection.State != ConnectionState.Closed)
            mySqlConnection.Close();
     }
</script>

Вот ссылка, которая поможет вам понять жизненный цикл страницы ASP.NET .

...