I've wrote a little iPad app with Xamarin.Forms. What I'm trying to do here is send some support tickets via a request to my server. I'm also keeping the "Failed" tickets in a collection so that I can try to send them in an other thread at app start. Can I improve my code or is it hopeless?
public void SendFailedTicketsTicketModul(ObservableCollection<TicketModel> queue) {
try {
if (!CheckConnection()) {
return;
}
for (var i = queue.Count - 1; i >= 0; i--) {
if (string.IsNullOrEmpty(queue[i].TicketId)) {
var requestResult = CreateRequest(queue[i]);
if (string.IsNullOrEmpty(requestResult)) {
continue;
}
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(requestResult);
var success = xmlDoc.GetElementsByTagName("status")[0].InnerText.Equals("Success");
if (!success) {
continue;
}
queue[i].TicketId = xmlDoc.GetElementsByTagName("workorderid")[0].InnerText;
}
if (queue[i].AttachmentCollection.Count > 0) {
for (var j = queue[i].AttachmentCollection.Count - 1; i >= 0; i--) {
var fileInfo = new FileInfo(queue[i].AttachmentCollection[j].FullPath);
if (!fileInfo.Exists) {
continue;
}
var attachmentResult = AddAttachmentRequest(queue[i].TicketId, fileInfo.Name,
fileInfo.FullName);
if (attachmentResult.Contains("Success")) {
queue[i].AttachmentCollection.RemoveAt(j);
}
}
}
if (!string.IsNullOrEmpty(queue[i].TicketId) && queue[i].AttachmentCollection.Count == 0) {
queue.RemoveAt(i);
}
}
}
catch (Exception ex) {
Debug.WriteLine(ex.Message);
Debug.WriteLine(ex.Source);
Debug.WriteLine(ex.StackTrace);
}
}
public XmlDocument FillXmlDoc(TicketModel ticketData) {
try {
var xmlData = Util.ReadPostDataXml();
if (string.IsNullOrEmpty(xmlData)) {
throw new ArgumentException($"{xmlData} is null or empty");
}
var postXml = new XmlDocument();
postXml.LoadXml(xmlData);
postXml.DocumentElement["requester"].InnerText = Util.Username;
postXml.DocumentElement["subject"].InnerText = ticketData.Subject;
postXml.DocumentElement["description"].InnerText = ticketData.Content;
postXml.DocumentElement["group"].InnerText = ticketData.Group;
var dateDiff = ticketData.DueDate.Subtract(DateTime.Today).Days;
postXml.DocumentElement["priority"].InnerText = dateDiff > 30
? "30 Tage"
: dateDiff.ToString("D2") + " Tage";
if (dateDiff == 1) {
postXml.DocumentElement["priority"].InnerText =
postXml.DocumentElement["priority"].InnerText.Remove(
postXml.DocumentElement["priority"].InnerText.Length - 1);
}
return postXml;
}
catch (Exception ex) {
Debug.WriteLine(ex.Message + " FillXmlDoc");
Debug.WriteLine(ex.StackTrace);
}
return null;
}
public string SendTicket(TicketModel ticketModel) {
Debug.WriteLine("SendTicket() start");
if (!CheckConnection()) return null;
try {
var requestResult = CreateRequest(ticketModel);
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(requestResult);
var success = xmlDoc.GetElementsByTagName("status")[0].InnerText.Equals("Success");
if (!success) {
Debug.WriteLine("Request Failed: " + xmlDoc.OuterXml);
return null;
}
ticketModel.TicketId = xmlDoc.GetElementsByTagName("workorderid")[0].InnerText;
if (ticketModel.AttachmentCollection.Count > 0) {
for (var j = ticketModel.AttachmentCollection.Count - 1; j >= 0; j--) {
var fileInfo = new FileInfo(ticketModel.AttachmentCollection[j].FullPath);
if (!fileInfo.Exists) {
Debug.WriteLine("Attachment not found");
ticketModel.AttachmentCollection.RemoveAt(j);
continue;
}
var attachmentResult = AddAttachmentRequest(ticketModel.TicketId, fileInfo.Name,
fileInfo.FullName);
if (attachmentResult.Contains("Success")) {
ticketModel.AttachmentCollection.RemoveAt(j);
}
else {
Debug.WriteLine("Add Attachment failed: " + attachmentResult);
}
}
}
if (!string.IsNullOrEmpty(ticketModel.TicketId) && ticketModel.AttachmentCollection.Count == 0)
return ticketModel.TicketId;
Debug.WriteLine("SendTicket() end");
return null;
}
catch (Exception ex) {
Util.PrintException(ex);
return null;
}
}
public string CreateRequest(TicketModel ticket) {
var requestXml = FillXmlDoc(ticket);
if (requestXml == null) {
return null;
}
try {
var taskString = new TaskCompletionSource<string>();
_requestDictionary = new Dictionary<string, string> {
{"TECHNICIAN_KEY", "49626A79-A60C-4565-B125-56AFDC332FE7"},
{"OPERATION_NAME", "ADD_REQUEST"},
{"INPUT_DATA", requestXml.OuterXml}
};
var restRequest = new RestRequest(Method.POST);
var restClient = new RestClient(new Uri("https://url.com")) {
Authenticator = new NtlmAuthenticator(new NetworkCredential("test", "test", "test"))
};
foreach (var param in _requestDictionary) {
restRequest.AddParameter(param.Key, param.Value);
}
restClient.ExecuteAsync(restRequest, response => {
taskString.SetResult(response.Content);
});
return taskString.Task.Result;
}
catch (Exception ex) {
Debug.WriteLine(ex.Message);
Debug.WriteLine(ex.StackTrace);
}
return string.Empty;
}
public string AddAttachmentRequest(string ticketId, string name, string fullName) {
try {
var taskString = new TaskCompletionSource<string>();
var restRequest = new RestRequest(Method.POST);
var restClient = new RestClient(new Uri("https://url.com" + ticketId +
"/attachment" + "?OPERATION_NAME=ADD_ATTACHMENT&TECHNICIAN_KEY=49626A79-A60C-4565-B125-56AFDC332FE7")) {
Authenticator = new NtlmAuthenticator(new NetworkCredential("test", "test", "test"))
};
restRequest.AddHeader("Content-Type", "multipart/form-data");
restRequest.AddFile(name, fullName);
restRequest.AlwaysMultipartFormData = true;
restClient.ExecuteAsync(restRequest, response => {
taskString.SetResult(response.Content);
});
return taskString.Task.Result;
}
catch (Exception ex) {
Debug.WriteLine(ex.Message);
Debug.WriteLine(ex.StackTrace);
}
return string.Empty;
}