22 Haziran 2018

Posta Güvercini C# Web Servis Tüketimi

Test Edilmemiştir!
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    public class PostaGuvercini
    {
        private readonly string Username;
        private readonly string Password;
        private readonly TimeSpan ExpireTime;
        public PostaGuvercini(string username, string password)
        {
            Username = username;
            Password = password;
            ExpireTime = TimeSpan.FromHours(24);
        }
        /// 
        /// Tek Mesaj Çok Alıcı
        /// 
        /// 
        /// 
        /// 
        public IResult SmsInsert_1_N(string[] recepients, string message)
        {
            try
            {
                var request = WebRequest.CreateHttp("http://www.postaguvercini.com/api_ws/smsservice.asmx");
                request.Method = "POST";
                request.Host = "www.postaguvercini.com";
                request.ContentType = "text/xml; charset=utf-8";
                request.Headers.Add("SOAPAction", "http://83.66.137.24/PgApiWs/SmsInsert_1_N");
                request.ContentLength = 0;


                var xeRecepients = new XElement("Recepients");
                foreach (var recepient in recepients)
                {
                    xeRecepients.Add(new XElement("string", recepient));
                }

                XNamespace nsXsd = "http://www.w3.org/2001/XMLSchema";
                XNamespace nsXsi = "http://www.w3.org/2001/XMLSchema-instance";
                XNamespace nsSoap = "http://schemas.xmlsoap.org/soap/envelope/";
                XNamespace nsPg = "http://83.66.137.24/PgApiWs";




                var xml = new XDocument(
                    new XDeclaration("1.0", "utf-8", null),
                    new XElement(nsSoap + "Envelope",
                    new XAttribute(XNamespace.Xmlns + "xsi", nsXsi),
                    new XAttribute(XNamespace.Xmlns + "xsd", nsXsd),
                    new XAttribute(XNamespace.Xmlns + "soap", nsSoap),
                    new XElement(nsSoap + "Body",
                        new XElement(nsPg + "SmsInsert_1_N",
                        new XAttribute("xmlns", "http://83.66.137.24/PgApiWs"),
                            new XElement(nsPg + "Username", Username),
                            new XElement(nsPg + "Password", Password),
                            new XElement(nsPg + "SendDate", DateTime.Now),
                            new XElement(nsPg + "ExpireDate", DateTime.Now.Add(ExpireTime)),
                            xeRecepients,
                            new XElement(nsPg + "Message", message)
                        )
                    )
                    ));

                var xmlData = Encoding.UTF8.GetBytes(xml.ToString());
                var length = xmlData.Length;
                request.ContentLength = length;
                using (var req = request.GetRequestStream())
                {
                    req.Write(xmlData, 0, length);
                }
                using (var resp = (HttpWebResponse)request.GetResponse())
                {
                    var reader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
                    var responseString = reader.ReadToEnd();
                    return new SmsSendResult(true, responseString, "SmsInsert_1_N");
                }
            }
            catch (WebException webex)
            {
                var errResp = webex.Response;
                using (Stream respStream = errResp.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
                    var responseString = reader.ReadToEnd();
                    return new SmsSendResult(false, responseString, "SmsInsert_1_N");

                }
            }
        }
        /// 
        /// Çok Mesaj Çok Alıcı
        /// 
        /// 
        /// 
        /// 
        public IResult SmsInsert_N_N(string[] recepients, string[] messages)
        {
            try
            {
                var request = WebRequest.CreateHttp("http://www.postaguvercini.com/api_ws/smsservice.asmx");
                request.Method = "POST";
                request.Host = "www.postaguvercini.com";
                request.ContentType = "text/xml; charset=utf-8";
                request.Headers.Add("SOAPAction", "http://83.66.137.24/PgApiWs/SmsInsert_N_N");
                request.ContentLength = 0;

                XNamespace nsXsd = "http://www.w3.org/2001/XMLSchema";
                XNamespace nsXsi = "http://www.w3.org/2001/XMLSchema-instance";
                XNamespace nsSoap = "http://schemas.xmlsoap.org/soap/envelope/";
                XNamespace nsPg = "http://83.66.137.24/PgApiWs";


                var xeMessages = new XElement("Messages");
                foreach (var message in messages)
                {
                    xeMessages.Add(new XElement("string", message));
                }

                var xeRecepients = new XElement("Recepients");
                foreach (var recepient in recepients)
                {
                    xeRecepients.Add(new XElement("string", recepient));
                }


                var xml = new XDocument(
                    new XDeclaration("1.0", "utf-8", null),
                    new XElement(nsSoap + "Envelope",
                    new XAttribute(XNamespace.Xmlns + "xsi", nsXsi),
                    new XAttribute(XNamespace.Xmlns + "xsd", nsXsd),
                    new XAttribute(XNamespace.Xmlns + "soap", nsSoap),
                    new XElement(nsSoap + "Body",
                        new XElement(nsPg + "SmsInsert_N_N",
                        new XAttribute("xmlns", "http://83.66.137.24/PgApiWs"),
                            new XElement(nsPg + "Username", Username),
                            new XElement(nsPg + "Password", Password),
                            new XElement(nsPg + "SendDate", DateTime.Now),
                            new XElement(nsPg + "ExpireDate", DateTime.Now.Add(ExpireTime)),
                            xeRecepients,
                            xeMessages
                        )
                    )
                    ));

                var xmlData = Encoding.UTF8.GetBytes(xml.ToString());
                var length = xmlData.Length;
                request.ContentLength = length;
                using (var req = request.GetRequestStream())
                {
                    req.Write(xmlData, 0, length);
                }
                using (var resp = (HttpWebResponse)request.GetResponse())
                {
                    var reader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
                    var responseString = reader.ReadToEnd();
                    return new SmsSendResult(true, responseString, "SmsInsert_N_N");
                }
            }
            catch (WebException webex)
            {
                var errResp = webex.Response;
                using (Stream respStream = errResp.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
                    var responseString = reader.ReadToEnd();
                    return new SmsSendResult(false, responseString, "SmsInsert_N_N");
                }
            }
        }


        /// 
        /// Kredi sorgulama
        /// 
        /// 
        public IResult CreditBalance()
        {
            try
            {
                var request = WebRequest.CreateHttp("http://www.postaguvercini.com/api_ws/smsservice.asmx");
                request.Method = "POST";
                request.Host = "www.postaguvercini.com";
                request.ContentType = "text/xml; charset=utf-8";
                request.Headers.Add("SOAPAction", "http://83.66.137.24/PgApiWs/CreditBalance");
                request.ContentLength = 0;




                XNamespace nsXsd = "http://www.w3.org/2001/XMLSchema";
                XNamespace nsXsi = "http://www.w3.org/2001/XMLSchema-instance";
                XNamespace nsSoap = "http://schemas.xmlsoap.org/soap/envelope/";
                XNamespace nsPg = "http://83.66.137.24/PgApiWs";




                var xml = new XDocument(
                    new XDeclaration("1.0", "utf-8", null),
                    new XElement(nsSoap + "Envelope",
                    new XAttribute(XNamespace.Xmlns + "xsi", nsXsi),
                    new XAttribute(XNamespace.Xmlns + "xsd", nsXsd),
                    new XAttribute(XNamespace.Xmlns + "soap", nsSoap),
                    new XElement(nsSoap + "Body",
                        new XElement(nsPg + "CreditBalance",
                        new XAttribute("xmlns", "http://83.66.137.24/PgApiWs"),
                            new XElement(nsPg + "Username", Username),
                            new XElement(nsPg + "Password", Password)
                            )
                        )
                    ));

                var xmlData = Encoding.UTF8.GetBytes(xml.ToString());
                var length = xmlData.Length;
                request.ContentLength = length;
                using (var req = request.GetRequestStream())
                {
                    req.Write(xmlData, 0, length);
                }
                using (var resp = (HttpWebResponse)request.GetResponse())
                {
                    var reader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
                    var responseString = reader.ReadToEnd();
                    return new CreditBalanceResult(true, responseString, "CreditBalance");
                }
            }
            catch (WebException webex)
            {
                var errResp = webex.Response;
                using (Stream respStream = errResp.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
                    var responseString = reader.ReadToEnd();
                    return new CreditBalanceResult(false, responseString, "CreditBalance");

                }
            }
        }
        public IResult SmsStatus(params string[] messageIds)
        {
            try
            {
                var request = WebRequest.CreateHttp("http://www.postaguvercini.com/api_ws/smsservice.asmx");
                request.Method = "POST";
                request.Host = "www.postaguvercini.com";
                request.ContentType = "text/xml; charset=utf-8";
                request.Headers.Add("SOAPAction", "http://83.66.137.24/PgApiWs/SmsStatus");
                request.ContentLength = 0;




                XNamespace nsXsd = "http://www.w3.org/2001/XMLSchema";
                XNamespace nsXsi = "http://www.w3.org/2001/XMLSchema-instance";
                XNamespace nsSoap = "http://schemas.xmlsoap.org/soap/envelope/";
                XNamespace nsPg = "http://83.66.137.24/PgApiWs";


                var xeMessageIds = new XElement("MessageIDs");
                foreach (var messageId in messageIds)
                {
                    xeMessageIds.Add(new XElement("string", messageId));
                }

                var xml = new XDocument(
                    new XDeclaration("1.0", "utf-8", null),
                    new XElement(nsSoap + "Envelope",
                    new XAttribute(XNamespace.Xmlns + "xsi", nsXsi),
                    new XAttribute(XNamespace.Xmlns + "xsd", nsXsd),
                    new XAttribute(XNamespace.Xmlns + "soap", nsSoap),
                    new XElement(nsSoap + "Body",
                        new XElement(nsPg + "SmsStatus",
                        new XAttribute("xmlns", "http://83.66.137.24/PgApiWs"),
                            new XElement(nsPg + "Username", Username),
                            new XElement(nsPg + "Password", Password),
                            xeMessageIds
                            )
                        )
                    ));

                var xmlData = Encoding.UTF8.GetBytes(xml.ToString());
                var length = xmlData.Length;
                request.ContentLength = length;
                using (var req = request.GetRequestStream())
                {
                    req.Write(xmlData, 0, length);
                }
                using (var resp = (HttpWebResponse)request.GetResponse())
                {
                    var reader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
                    var responseString = reader.ReadToEnd();
                    return new SmsSendResult(true, responseString, "SmsStatus");
                }
            }
            catch (WebException webex)
            {
                var errResp = webex.Response;
                using (Stream respStream = errResp.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
                    var responseString = reader.ReadToEnd();
                    return new SmsSendResult(false, responseString, "SmsStatus");

                }
            }
        }
        public IResult SmsSend(string[] receipents, params string[] messages)
        {
            if (receipents == null || receipents.Length == 0)
            {
                throw new ArgumentNullException("receipents", new Exception("Alıcılar boş gönderilemez"));
            }
            if (messages == null || receipents.Length == 0)
            {
                throw new ArgumentNullException("messages", new Exception("Boş mesaj gönderilemez"));
            }

            if (messages.Length == 1)
                return SmsInsert_1_N(receipents, messages[0]);
            else
                return SmsInsert_N_N(receipents, messages);
        }

        public IResult SmsSend(string receipent, params string[] messages)
        {
            if (string.IsNullOrWhiteSpace(receipent))
            {
                throw new ArgumentNullException("receipent", new Exception("Alıcı boş gönderilemez"));
            }
            var receipents = new string[1] { receipent };
            return SmsSend(receipents, messages);
        }


        public interface IResult
        {
            string OperationName { get; }
            bool Succeded { get; }
            T Result { get; }
            Fault Fault { get; }
            string ToString();
        }

        public class Fault
        {
            public readonly string FaultCode;
            public readonly string FaultString;
            public readonly string Detail;
            public Fault(string faultCode, string faultString, string detail)
            {
                FaultCode = faultCode;
                FaultString = faultString;
                Detail = detail;
            }
            public override string ToString()
            {
                return $"HATA! Fault Code: {FaultCode} \n Fault String: {FaultString}\n Detail:{Detail}";
            }
        }
        public class SmsSendResult : IResult
        {
            private readonly string operationName;
            private readonly bool succeded;
            private readonly string[] result;
            private readonly Fault fault;

            public string OperationName => operationName;
            public bool Succeded => succeded;
            public string[] Result => result;
            public Fault Fault => fault;

            public SmsSendResult(bool succeded, string responseText, string operationName)
            {
                this.operationName = operationName;
                this.succeded = succeded;
                this.result = succeded ? ParseSmsInsertResponse(responseText) : null;
                this.fault = succeded ? null : ParseError(responseText);
            }
            public override string ToString()
            {
                if (Succeded)
                {
                    var sb = new StringBuilder();
                    sb.Append("BAŞARILI! ");
                    foreach (var _result in Result)
                    {
                        sb.AppendLine(_result);
                    }
                    return sb.ToString();
                }
                else
                    return Fault.ToString();
            }
        }
        public class CreditBalanceResult : IResult
        {
            private readonly string operationName;
            private readonly bool succeded;
            private readonly int result;
            private readonly Fault fault;

            public string OperationName => operationName;
            public bool Succeded => succeded;
            public int Result => result;
            public Fault Fault => fault;

            public CreditBalanceResult(bool succeded, string responseText, string operationName)
            {
                this.operationName = operationName;
                this.succeded = succeded;
                this.result = succeded ? ParseCreditBalanceResponse(responseText) : -1;
                this.fault = succeded ? null : ParseError(responseText);
            }
            public override string ToString()
            {
                if (Succeded)
                {
                    var sb = new StringBuilder();
                    sb.Append("BAŞARILI! Kredi Sorgulama Sonucu: ");
                    sb.Append(Result);
                    return sb.ToString();
                }
                else
                    return Fault.ToString();
            }
        }
        private static string[] ParseSmsInsertResponse(string responseText)
        {
            var xDoc = XDocument.Parse(responseText);
            var soapBody = (XElement)((XElement)(xDoc.FirstNode)).FirstNode;
            var soapFault = (XElement)((soapBody)).FirstNode;
            var soapResponse = (XElement)((soapBody)).FirstNode;
            var soapResults = (XElement)((soapBody)).FirstNode;
            var resultCount = soapResults.Elements().Count();

            var results = new string[resultCount];
            for (int i = 0; i < resultCount; i++)
            {
                results[0] = results[i];
            }
            return results;
        }
        private static int ParseCreditBalanceResponse(string responseText)
        {
            var xDoc = XDocument.Parse(responseText);
            var soapBody = (XElement)((XElement)(xDoc.FirstNode)).FirstNode;
            var soapFault = (XElement)((soapBody)).FirstNode;
            var soapResponse = (XElement)((soapBody)).FirstNode;
            var soapResults = (XElement)((soapBody)).FirstNode;

            return Convert.ToInt32(soapResults.Value);
        }
        private static Fault ParseError(string responseText)
        {
            if (!string.IsNullOrWhiteSpace(responseText))
            {
                var xDoc = XDocument.Parse(responseText);
                var soapBody = (XElement)((XElement)(xDoc.FirstNode)).FirstNode;
                var soapFault = (XElement)((soapBody)).FirstNode;

                var faultCode = string.Empty;
                var faultString = string.Empty;
                var detail = string.Empty;
                foreach (var item in soapFault.Elements())
                {
                    switch (item.Name.LocalName)
                    {
                        case "faultcode":
                            faultCode = item?.Value;
                            break;
                        case "faultstring":
                            faultString = item?.Value;
                            break;
                        case "detail":
                            detail = item?.Value;
                            break;
                    }
                }
                return new Fault(faultCode, faultString, detail);
            }
            return null;
        }

    }
}