ich bin gerade daran den OTRS-RPC Service zu nutzen um einen neuen Artikel zu erstellen. Leider habe ich mit meinem momentanen Fortschritt noch das Problem das ich keine Antwort vom Service bekomme, und dass das erstellte Ticket noch nicht dem entspricht was ich erwarten würde. Vielleicht kann mir ja einer von euch weiterhelfen und sagen warum ich keine Antwort von dem Service bekomme. Anbei der von mir verwendete Code (hilft vielleicht auch dem einen oder anderen dabei in diesem Thema weiterzukommen). Über jeden von euch gelieferten Tip oder Anmerkung bin ich jetzt schon dankbar

Gruß,
Afra
Code: Select all
using System;
using System.Net;
using System.Xml;
using System.IO;
using System.Collections;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
#region fields
/// <summary>
/// File path vars.
/// </summary>
private static String errorFilePath = "C:\\OTRS_RPC\\otrserror.xml";
private static String requestfilepath = "C:\\OTRS_RPC\\{0}_otrsrequest_Service{1}.xml";
private static String responsefilepath = "C:\\OTRS_RPC\\{0}_otrsanswer_Service{1}.xml";
private static String dateTimeFormat = "yyyyMMddTHHmmss";
#region SERVICE_TICKETNUMBER
private const int SERVICE_TICKETNUMBER = 1;
/// <summary>
/// This soap request tells otrs to count up the ticket number.
/// Format params:
/// {0}: username
/// {1}: password
/// </summary>
private static String SOAP_TICKETNUMBER = @"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" soap:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap:Body>
<Dispatch xmlns=""/Core"">
<c-gensym4>{0}</c-gensym4>
<c-gensym6>{1}</c-gensym6>
<c-gensym8>TicketObject</c-gensym8>
<c-gensym10>TicketCreateNumber</c-gensym10>
</Dispatch>
</soap:Body>
</soap:Envelope>";
#endregion
#region SERVICE_CREATETICKET
private const int SERVICE_CREATETICKET = 2;
/// <summary>
/// This soap request tells otrs to create a new ticket.
/// Format params:
/// {0}: username
/// {1}: password
/// {2}: ticket number
/// {3}: ticket title
/// {4}: queue name
/// {5}: lock status
/// {6}: priority id
/// {7}: ticket state
/// {8}: customer user
/// {9}: owner id
/// {10}: user id
/// </summary>
private static String SOAP_CREATETICKET = @"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" soap:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap:Body>
<Dispatch xmlns=""/Core"">
<c-gensym13>{0}</c-gensym13>
<c-gensym15>{1}</c-gensym15>
<c-gensym17>TicketObject</c-gensym17>
<c-gensym19>TicketCreate</c-gensym19>
<c-gensym21>TN</c-gensym21>
<c-gensym23>{2}</c-gensym23>
<c-gensym25>Title</c-gensym25>
<c-gensym27>{3}</c-gensym27>
<c-gensym29>Queue</c-gensym29>
<c-gensym31>{4}</c-gensym31>
<c-gensym33>Lock</c-gensym33>
<c-gensym35>{5}</c-gensym35>
<c-gensym37>PriorityID</c-gensym37>
<c-gensym39>{6}</c-gensym39>
<c-gensym41>State</c-gensym41>
<c-gensym43>{7}</c-gensym43>
<c-gensym45>CustomerUser</c-gensym45>
<c-gensym47>{8}</c-gensym47>
<c-gensym49>OwnerID</c-gensym49>
<c-gensym51>{9}</c-gensym51>
<c-gensym57>UserID</c-gensym57>
<c-gensym59>{10}</c-gensym59>
</Dispatch>
</soap:Body>
</soap:Envelope>";
#endregion
#region SERVICE_CREATETICKETARTICLE
private const int SERVICE_CREATETICKETARTICLE = 3;
/// <summary>
/// This soap request tells otrs to create a new article for a specific ticket.
/// Format params:
/// {0}: username
/// {1}: password
/// {2}: ticket number
/// {3}: article type
/// {4}: sender type
/// {5}: from
/// {6}: to
/// {7}: cc
/// {8}: reply to
/// {9}: subject
/// {10}: body
/// {11}: MessageID
/// {12}: Charset
/// {13}: HistoryType
/// {14}: HistoryComment
/// {15}: UserID
/// {16}: NoAgentNotify
/// {17}: Type
/// {18}: Loop
/// </summary>
private static String SOAP_CREATETICKETARTICLE = @"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" soap:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap:Body>
<Dispatch xmlns=""/Core"">
<c-gensym62>{0}</c-gensym62>
<c-gensym64>{1}</c-gensym64>
<c-gensym66>TicketObject</c-gensym66>
<c-gensym68>ArticleSend</c-gensym68>
<c-gensym70>TicketID</c-gensym70>
<c-gensym72>{2}</c-gensym72>
<c-gensym74>ArticleType</c-gensym74>
<c-gensym76>{3}</c-gensym76>
<c-gensym78>SenderType</c-gensym78>
<c-gensym80>{4}</c-gensym80>
<c-gensym82>From</c-gensym82>
<c-gensym84>{5}</c-gensym84>
<c-gensym86>To</c-gensym86>
<c-gensym88>{6}</c-gensym88>
<c-gensym90>Cc</c-gensym90>
<c-gensym92>{7}</c-gensym92>
<c-gensym94>ReplyTo</c-gensym94>
<c-gensym96>{8}</c-gensym96>
<c-gensym98>Subject</c-gensym98>
<c-gensym100>{9}</c-gensym100>
<c-gensym102>Body</c-gensym102>
<c-gensym104>{10}</c-gensym104>
<c-gensym106>MessageID</c-gensym106>
<c-gensym108>{11}</c-gensym108>
<c-gensym110>Charset</c-gensym110>
<c-gensym112>{12}</c-gensym112>
<c-gensym114>HistoryType</c-gensym114>
<c-gensym116>{13}</c-gensym116>
<c-gensym118>HistoryComment</c-gensym118>
<c-gensym120>{14}</c-gensym120>
<c-gensym122>UserID</c-gensym122>
<c-gensym124>{15}</c-gensym124>
<c-gensym126>NoAgentNotify</c-gensym126>
<c-gensym128>{16}</c-gensym128>
<c-gensym130>Type</c-gensym130>
<c-gensym132>{17}</c-gensym132>
<c-gensym134>Loop</c-gensym134>
<c-gensym136>{18}</c-gensym136>
</Dispatch>
</soap:Body>
</soap:Envelope>";
#endregion
#endregion
static void Main(string[] args)
{
/*
* Pre's: Activate and set user and pw in otrs admin interface Core::SOAP
* Install SOAP::Lite Perl module on the otrs host
*/
//setting
String url = "http://otrs-adress/otrs/rpc.pl";
String username = "root";
String password = "root";
String ticketNo = "28843";
//allow unsafe header parsing
//setAllowUnsafeHeaderParsing();
//ticketnumber++
ArrayList data = new ArrayList();
data.Add(username);
data.Add(password);
serviceCall(url, SERVICE_TICKETNUMBER, data);
//create ticket
data.Clear();
data.Add(username); //username
data.Add(password); //password
data.Add(ticketNo); //ticket number
data.Add("RPC Test Ticket"); //ticket title
data.Add("Postmaster"); //queue name
data.Add("unlock"); //lock status
data.Add("2"); //priority id
data.Add("New"); //ticket state
data.Add("a@b.de"); //customer user
data.Add("1"); //owner id (1 is root)
data.Add("1"); //user id (1 is root)
//serviceCall(url, SERVICE_CREATETICKET, data);
//create article for a ticket
data.Clear();
data.Add(username); //username
data.Add(password); //password
data.Add(ticketNo); //ticket number
data.Add("email-external"); //article type
data.Add("agent"); //sender type
data.Add("a@b.de"); //from
data.Add("a@b.de"); //to
data.Add(""); //cc
data.Add(""); //reply to
data.Add("Test Ticket using RPC"); //subject
data.Add("Herewith I declare this ticket articled!"); //body
data.Add(""); //MessageID
data.Add("ISO-8859-15"); //Charset
data.Add("NewTicket"); //HistoryType
data.Add("Created through RPC service"); //HistoryComment
data.Add("1"); //UserID
data.Add("0"); //NoAgentNotify
data.Add("text/plain"); //Type
data.Add("0"); //Loop
//serviceCall(url, SERVICE_CREATETICKETARTICLE, data);
}
/// <summary>
/// Set the HttpWebRequest config to allow unsafe header parsing.
/// </summary>
/// <returns></returns>
public static bool setAllowUnsafeHeaderParsing()
{
//Get the assembly that contains the internal class
Assembly aNetAssembly = Assembly.GetAssembly(typeof(System.Net.Configuration.SettingsSection));
if (aNetAssembly != null)
{
//Use the assembly in order to get the internal type for the internal class
Type aSettingsType = aNetAssembly.GetType("System.Net.Configuration.SettingsSectionInternal");
if (aSettingsType != null)
{
//Use the internal static property to get an instance of the internal settings class.
//If the static instance isn't created allready the property will create it for us.
object anInstance = aSettingsType.InvokeMember("Section",
BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.NonPublic, null, null, new object[] { });
if (anInstance != null)
{
//Locate the private bool field that tells the framework is unsafe header parsing should be allowed or not
FieldInfo aUseUnsafeHeaderParsing = aSettingsType.GetField("useUnsafeHeaderParsing", BindingFlags.NonPublic | BindingFlags.Instance);
if (aUseUnsafeHeaderParsing != null)
{
aUseUnsafeHeaderParsing.SetValue(anInstance, true);
return true;
}
}
}
}
return false;
}
/// <summary>
/// Returns a HttpWebRequest for otrs soap action.
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static HttpWebRequest createWebRequest(string url)
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Headers.Add("SOAP:Action");
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
webRequest.Proxy = WebRequest.DefaultWebProxy;
return webRequest;
}
/// <summary>
/// Performs a service call to the otrs system.
/// </summary>
/// <param name="url"></param>
/// <param name="service"></param>
/// <param name="data"></param>
/// <returns></returns>
public static XmlDocument serviceCall(string url, int service, ArrayList data)
{
HttpWebRequest request = createWebRequest(url);
XmlDocument soapEnvelopeXml = getSoapXml(service, data);
//write request to file
XmlWriter xw = XmlWriter.Create(String.Format(requestfilepath, DateTime.Now.ToString(dateTimeFormat), service);
soapEnvelopeXml.WriteContentTo(xw);
xw.Flush();
xw.Close();
using (Stream stream = request.GetRequestStream())
{
soapEnvelopeXml.Save(stream);
}
IAsyncResult asyncResult = request.BeginGetResponse(null, null);
asyncResult.AsyncWaitHandle.WaitOne();
string soapResult = String.Empty;
try
{
using (WebResponse webResponse = request.EndGetResponse(asyncResult))
using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
{
soapResult = rd.ReadToEnd();
}
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
WebResponse eresp = e.Response;
using (StreamReader sr = new StreamReader(eresp.GetResponseStream()))
{
String sresp = "\r\n<" + DateTime.Now.ToString(dateTimeFormat) + ">\r\n" + sr.ReadToEnd();
File.AppendAllText(errorFilePath, sresp);
}
}
}
//write answer to file
File.WriteAllText(String.Format(responsefilepath,DateTime.Now.ToString(dateTimeFormat),service), soapResult);
XmlDocument resp = new XmlDocument();
try
{
resp.LoadXml(soapResult);
}
catch (Exception) { }
return resp;
}
/// <summary>
/// Returns an XmlDocument for the stated service.
/// </summary>
/// <param name="service"></param>
/// <param name="data"></param>
/// <returns></returns>
private static XmlDocument getSoapXml(int service, ArrayList data)
{
XmlDocument retVal = new XmlDocument();
switch (service)
{
case SERVICE_TICKETNUMBER:
{
String soapenv = String.Format(SOAP_TICKETNUMBER,
data[0].ToString()
, data[1].ToString());
retVal.LoadXml(soapenv);
return retVal;
}
case SERVICE_CREATETICKET:
{
String soapenv = String.Format(SOAP_CREATETICKET,
data[0].ToString()
, data[1].ToString()
, data[2].ToString()
, data[3].ToString()
, data[4].ToString()
, data[5].ToString()
, data[6].ToString()
, data[7].ToString()
, data[8].ToString()
, data[9].ToString()
, data[10].ToString());
retVal.LoadXml(soapenv);
return retVal;
}
case SERVICE_CREATETICKETARTICLE:
{
String soapenv = String.Format(SOAP_CREATETICKETARTICLE,
data[0].ToString()
, data[1].ToString()
, data[2].ToString()
, data[3].ToString()
, data[4].ToString()
, data[5].ToString()
, data[6].ToString()
, data[7].ToString()
, data[8].ToString()
, data[9].ToString()
, data[10].ToString()
, data[11].ToString()
, data[12].ToString()
, data[13].ToString()
, data[14].ToString()
, data[15].ToString()
, data[16].ToString()
, data[17].ToString()
, data[18].ToString());
retVal.LoadXml(soapenv);
return retVal;
}
default:{
throw new Exception("InvalidServiceException: The requested service does not exist.");
}
}
}
}
}