Страница 1 из 1

.NET приложение на C# для создания заявок в OTRS

Добавлено: 25 мар 2015, 11:47
dcvetkov
Недавно возникла потребность написать .NET приложение на C# для создания заявок в OTRS.
На понимания, как это вообще реализуется, потратил пару дней. Поэтому решил выложить, вдруг кому пригодится.
Я не профессиональный программист, поэтому прошу не пинать сильно за код, но с интересом выслушаю конструктивную критику.
Знаю, что можно загружать какой-то WSDL файл с готовым классом для OTRS, но я не понял, как это делать)).
Мой способ, возможно, не очень "красивый", но рабочий. Я вручную создаю XML запросы и отправляю их с помощью HttpWebRequest.
otrs_ticket_generator.png
otrs_ticket_generator.png (27.42 КБ) 16505 просмотров
Во вложении готовый проект Visual Studio 2012.
Код выкладываю следующим сообщением.

Re: .NET приложение на C# для создания заявок в OTRS

Добавлено: 25 мар 2015, 11:50
dcvetkov

Код: Выделить всё

using System;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Net;
using System.IO;

namespace OTRS_Ticket_Generator
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            textBox5.Text = "http://otrs-server/otrs/nph-genericinterface.pl/Webservice/webservice1";
            textBox4.Text = "2";
        }

        // Создание заявки
        void button1_Click(object sender, EventArgs e)
        {
            // Статус заявки - открыта или закрыта.
            string ticket_status = "";
            if (checkBox1.Checked) ticket_status = "2";
            else ticket_status = "4";

            // Тема заявки - перве 30 символов текста.
            string ticket_title = richTextBox1.Text.Substring(0, Math.Min(30, richTextBox1.Text.Length));
            string ticket_subject = ticket_title;

            string request = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Body><TicketCreate><UserLogin>"
                + textBox1.Text + "</UserLogin><Password>" 
                + textBox2.Text + "</Password><Ticket><Title>"
                + ticket_title + "</Title><CustomerUser>"
                + textBox3.Text + "</CustomerUser><QueueID>"
                + textBox4.Text + "</QueueID><StateID>"
                + ticket_status + "</StateID>"
                + "<PriorityID>3</PriorityID>"
                + "<TypeID>1</TypeID>"
                + "</Ticket><Article><Subject>" 
                + ticket_subject + "</Subject><Body>" 
                + richTextBox1.Text + "</Body><ContentType>text/plain; charset=utf8</ContentType></Article></TicketCreate></soapenv:Body></soapenv:Envelope>";

            XmlDocument doc = new XmlDocument();
            try
            {
                // Здесь выполняется запрос.
                doc.LoadXml(CallWebService(request));

                string ArticleID = "";
                string TicketID = "";
                string TicketNumber = "";
                int success = 0;

                // Анализируем полученный ответ.
                foreach (XmlNode node in doc.DocumentElement) foreach (XmlNode child in node.ChildNodes)
                    {
                        foreach (XmlNode child2 in child.ChildNodes)
                        {
                            // Проверяем наличие всех 3-ёх элементов успешного ответа.
                            if (child2.Name == "ArticleID") { success++; ArticleID = child2.InnerText; }
                            if (child2.Name == "TicketID") { success++; TicketID = child2.InnerText; }
                            if (child2.Name == "TicketNumber") { success++; TicketNumber = child2.InnerText; }
                        }
                    }

                if (success == 3)
                {
                    MessageBox.Show("Заявка создана, TicketID = " + TicketID);
                    textBox6.Text = TicketID;
                }
                else MessageBox.Show("Ошибка при создании заявки: \n" + doc.InnerText);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка при создании заявки: \n" + ex.Message);
            }
        }

        // Получение информации о заявке
        void button2_Click(object sender, EventArgs e)
        {
            string request = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Body><TicketGet><UserLogin>"
            + textBox1.Text + "</UserLogin><Password>"
            + textBox2.Text + "</Password><TicketID>"
            + textBox6.Text + "</TicketID></TicketGet></soapenv:Body></soapenv:Envelope>";

            XmlDocument doc = new XmlDocument();

            try
            {
                // Здесь выполняется запрос.
                doc.LoadXml(CallWebService(request));

                string result = "";

                // Анализируем полученный ответ.
                foreach (XmlNode node in doc.DocumentElement) foreach (XmlNode child in node.ChildNodes)
                    {
                        foreach (XmlNode child2 in child.ChildNodes)
                        {
                            foreach (XmlNode child3 in child2.ChildNodes)
                            {
                                result += child3.Name + ": " + child3.InnerText + "\n";
                            }
                        }
                    }
                MessageBox.Show(result);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        string CallWebService(string str)
        {
            XmlDocument soapEnvelopeXml = new XmlDocument();
            soapEnvelopeXml.LoadXml(str);

            HttpWebRequest webRequest = CreateWebRequest(textBox5.Text);
            InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
            IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
            asyncResult.AsyncWaitHandle.WaitOne();

            string soapResult = "";

            try
            {
                using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
                {
                    using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
                    {
                        soapResult = rd.ReadToEnd();
                    }
                }
            }
            catch (Exception ex)
            {
                soapResult = ex.Message;
            }

            return soapResult;
        }

        HttpWebRequest CreateWebRequest(string url)
        {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
            webRequest.Headers.Add("SOAPAction", url);
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            return webRequest;
        }

        void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
        {
            using (Stream stream = webRequest.GetRequestStream())
            {
                soapEnvelopeXml.Save(stream);
            }
        }
    }
}

Re: .NET приложение на C# для создания заявок в OTRS

Добавлено: 25 авг 2015, 14:07
Respik
Что-то не получается заставить работать данную вещь, можете как-то подробней объяснить...

Re: .NET приложение на C# для создания заявок в OTRS

Добавлено: 04 окт 2015, 15:05
dcvetkov
Respik писал(а):Что-то не получается заставить работать данную вещь, можете как-то подробней объяснить...
На каком этапе не получается? Компьютер включается? ;)