Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

8 Aralık 2013 Pazar

PFX dosyasıyla WebRequest yaparak C# ile HTTP formundaki verileri gönderebilmek

Bir arkadaşıma yazmıştım anlaşılır olsun diye ve belki başkalarının da işine yarar ümidiyle buraya eklemiş olayım.
using System;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace ConsoleApplication1
{
    public class Program
    {
        private static void Main(string[] args)
        {
            try
            {
                // Web talebi yapacağımız nesneyi yaratırken gideceğimiz web adresini belirtiyoruz
                // Bu adres başta https://www.aidap.naimes.faa.gov/aidap/qhome.html muş gibi görünsede
                // aslında sayfadaki formun gideceği web adresi (sol tarafta html formun action kısmında bulabilirsin).
                HttpWebRequest talep =
                    (HttpWebRequest) WebRequest.Create("https://www.aidap.naimes.faa.gov/aidap/XmlNotamServlet");


                #region Sertifika işlemlerimiz

                // Sertifikamızı dosyadan çekip şifre ile nesnemizi yaratıyoruz
                X509Certificate2 clientCertificate = new X509Certificate2(@"C:\aidapuser_2013.pfx", "WC##20abba");
                // talep nesnemize sertifikamızı ekleyelim
                talep.ClientCertificates.Add(clientCertificate);
                talep.Credentials = CredentialCache.DefaultCredentials;

                // isteklerimizi zaman içerisinde yaparken Credential'ı değiştirmeyeceğimiz için true yapıyoruz. 
                // Aralarda farklı credentiallar kullanacak olsaydık false yapar, her isteğimizin authenticate edilmesini sunucuya bildirirdik
                talep.PreAuthenticate = true;

                #endregion


                #region Talep edeceğimiz bilgiler ve talep yöntemimiz

                // bağlantıyı açık tutalım ki birden fazla gidiş gelişlerde TCP işlemlerini her defasında tekrarlayarak arka planda zaman ve emek kaybetmesin
                talep.KeepAlive = true;

                // Talebimiz sadece bir url değil, form bilgilerimizin POST metoduyla gönderimi olduğundan ContentType aşağıdaki gibi olacak
                talep.ContentType = "application/x-www-form-urlencoded";

                // html de 
etiketinin özellikleri şunlardır: //
// ... //
talep.Method = "POST"; // Sayfadaki text kutuları, dropdownların hepsinin bir id'si var ve içlerindeki ya da seçilmiş değerleri ise value olarak // degisken1=deger1°isken2=deger2&..... şeklinde yazılır // aşağıdaki bilgide user id= SXS, password=notam123*, active=Y ve location_id=LTFG olarak gönderilirken diğerleri boş olarak gidiyor. string formunIcerigi = "uid=kullaniciAdiii&password=abc123*&active=Y&lastmod=&todate=&type=&account_id=&location_id=LTFG¬am_id=¬am_text=¬am_report="; // form içeriğini byte[] (byte dizisine) çevirmemiz gerekiyor yani her karakter byte değeriyle gidecek. Mesela; // A h m e t metninin byte dizisi hali // 065 104 109 101 116 (decimal hali) var encoder = new ASCIIEncoding(); var requestData = encoder.GetBytes(formunIcerigi); // Talebimizin içeriğinin ne kadar olduğunu yazalım talep.ContentLength = requestData.Length; #endregion // istemci ile(bizim program), sunucu arasında kurduğumuz bağlantı akışını ele geçirelim (içinden su geçebilen hortum gibi düşün) var gidenAkis = talep.GetRequestStream(); // talebimizin byte[] halini hortumdan akıtmamız gerekecek gidenAkis.Write(requestData, 0, requestData.Length); // şimdi verilerimiz gittiğine göre gidenAkışımızı kapatlım ve gelen akışa bakalım. gidenAkis.Close(); // Protokolün talep kısmı tamamlandı, şimdi cevap kısmını görebileceğimiz nesnemizi talep nesnemize oluşturtalım // Bu tıpkı; // "Git bak ahmet ne yapıyormuş" deyip çocuğu gönderdikten sonra, çocuk gelince // "eee... ne yapıyormuş?" diye sormamıza benzer. Elçiyi gönderdik ve elçi dönünce muhatabımızın cevabını elçiye sormamız gibi. var cevap = (HttpWebResponse) talep.GetResponse(); // HTTP ile dosya indirirken nasıl GBlarca veriyi çektiğimiz bir CEVAP akışı varsa burada da aynı gelen akışını yaratıyoruz. Stream gelen_akisi = cevap.GetResponseStream(); // Dönen cevabı stringe çevirip ekranda gösteriyoruz. StreamReader sr = new StreamReader(gelen_akisi); String result = sr.ReadToEnd(); Console.WriteLine(result); // Kaynaklarla işimiz bitti iade edelim. sr.Close(); gelen_akisi.Close(); } catch (Exception ex) { throw (ex); } } } }