Недавно возникла потребность написать .NET приложение на C# для создания заявок в OTRS.
На понимания, как это вообще реализуется, потратил пару дней. Поэтому решил выложить, вдруг кому пригодится.
Я не профессиональный программист, поэтому прошу не пинать сильно за код, но с интересом выслушаю конструктивную критику.
Знаю, что можно загружать какой-то WSDL файл с готовым классом для OTRS, но я не понял, как это делать)).
Мой способ, возможно, не очень "красивый", но рабочий. Я вручную создаю XML запросы и отправляю их с помощью HttpWebRequest.
Во вложении готовый проект Visual Studio 2012.
Код выкладываю следующим сообщением.
.NET приложение на C# для создания заявок в OTRS
Модератор: ykolesnikov
.NET приложение на C# для создания заявок в OTRS
- Вложения
-
- OTRS Ticket Generator.7z
- (13.64 КБ) 730 скачиваний
Re: .NET приложение на C# для создания заявок в OTRS
Код: Выделить всё
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
Что-то не получается заставить работать данную вещь, можете как-то подробней объяснить...
Re: .NET приложение на C# для создания заявок в OTRS
На каком этапе не получается? Компьютер включается?Respik писал(а):Что-то не получается заставить работать данную вещь, можете как-то подробней объяснить...
