{"id":9048,"date":"2011-07-16T22:20:00","date_gmt":"2011-07-16T20:20:00","guid":{"rendered":"https:\/\/fatihboy.com\/post\/uygulama-kurtarma-2"},"modified":"2021-06-19T09:29:21","modified_gmt":"2021-06-19T06:29:21","slug":"uygulama-kurtarma","status":"publish","type":"post","link":"https:\/\/fatihboy.com\/en\/uygulama-kurtarma\/","title":{"rendered":"C# ile Uygulama Kurtarma"},"content":{"rendered":"<p>&nbsp;&nbsp; En hatas\u0131z yaz\u0131lan uygulamalar bile zaman zaman hata vererek sonlanabilir, bu hepimizin bildi\u011fi bir ger\u00e7ektir. Uygulamalar\u0131m\u0131zda bir hata tespit etti\u011fimizde yap\u0131lacak en do\u011fru \u015fey, \u015f\u00fcphesiz ki, bu hatay\u0131 d\u00fczelmek olacakt\u0131r. Peki biz bunu yapana kadar son kullan\u0131c\u0131lar ne ya\u015f\u0131yorlar? D\u00fc\u015f\u00fcn\u00fcn bir kere; bilgisayar\u0131n\u0131za bir uygulama kurdunuz, pek \u00e7ok i\u015flem yapt\u0131n\u0131z; fakat i\u015flerinizi kaydetmeden hemen \u00f6nce programda hata olu\u015ftu ve windows\u2019un uygulamay\u0131 sonland\u0131rma penceresi kar\u015f\u0131m\u0131za geldi\u2026 Normalde bu durum son kullan\u0131c\u0131 a\u00e7\u0131s\u0131ndan tam bir kabus olacakt\u0131r, saatlerdir yapt\u0131\u011f\u0131 her \u015fey kaybolacak\u2026 Peki size bunun bir \u00e7\u00f6z\u00fcm\u00fc oldu\u011funu s\u00f6ylesem \ud83d\ude09<\/p>\n\n\n\n<p>&nbsp;&nbsp; Windows geli\u015ftiricileri bu s\u0131k\u0131nt\u0131n\u0131n fark\u0131na vararak Windows Vista ve \u00fcst\u00fc i\u015fletim sistemlerinde uygulamalar\u0131n bu gibi hatalarda durum bilgilerini saklamak\/kurtarabilmek ad\u0131na bir API geli\u015ftirmi\u015fler; <strong>Application Recovery API<\/strong>.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bu API, geli\u015ftiricilere uygulamalar\u0131n\u0131n bir hata nedeniyle sonlanaca\u011f\u0131n\u0131 bilme ve kritik bilgileri saklayabilme \u015fans\u0131 vermekte. Dolay\u0131s\u0131yla da son kullan\u0131c\u0131 a\u00e7\u0131s\u0131ndan, deyin yerindeyse, daha <em>iyi<\/em> bir uygulama hata deneyimi sunmakta. E\u011fer Office uygulamalar\u0131n\u0131n g\u00fcncel s\u00fcr\u00fcmlerini kullan\u0131yorsan\u0131z bunu fark etme olas\u0131l\u0131\u011f\u0131n\u0131z olduk\u00e7a y\u00fcksek. Hatta, Visual Studio ile \u00e7al\u0131\u015f\u0131yorsan\u0131z (<em>ki sitemi takip ediyorsan\u0131z \u00f6yle oldu\u011funuzu d\u00fc\u015f\u00fcnmem ka\u00e7\u0131n\u0131lmazd\u0131r<\/em>) bunu pek \u00e7ok kereler g\u00f6rm\u00fc\u015fs\u00fcn\u00fczd\u00fcr; Visual Studio\u2019nun \u00e7al\u0131\u015fmas\u0131 hata nedeniyle sonlanmas\u0131 durumunda Windows yeniden ba\u015flatmak isteyip istemedi\u011fimizi sormakta ve olumlu yan\u0131tta da yeniden ba\u015flatmakta. \u00dcstelik bunu yaparken de hata \u00f6ncesi a\u00e7\u0131k olan proje, kurtarma verisi ile birlikte, yeniden a\u00e7\u0131lmakta. Benzer bir i\u015fleve kendi geli\u015ftirdi\u011fimiz uygulamalar\u0131m\u0131z\u0131n da sahip olmas\u0131 ne kadar g\u00fczel olurdu de\u011fil mi! \u00d6rne\u011fin; kullan\u0131c\u0131 uygulamam\u0131zda login olmu\u015f ve&nbsp; x,y,z ekranlar\u0131n\u0131 a\u00e7m\u0131\u015f. Ard\u0131ndan ald\u0131\u011f\u0131 hata sonras\u0131nda uygulama yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda yeniden login olmaya ve ekranlar\u0131 a\u00e7maya gerek kalmadan uygulama bu i\u015flemleri otomatik ger\u00e7ekle\u015ftirse!!?? \u0130\u015fte ba\u015far\u0131l\u0131 bir uygulama, y\u00fcksek kullan\u0131c\u0131 deneyimi diye buna denir, de\u011fil mi! Bu makalemde i\u015fte tam da bu konuya de\u011finiyor olaca\u011f\u0131m; hata an\u0131nda uygulamalar\u0131m\u0131zda nas\u0131l daha iyi bir kullan\u0131c\u0131 deneyimi sunabilece\u011fimizi anlat\u0131yor olaca\u011f\u0131m.<\/p>\n\n\n\n<p>&nbsp;&nbsp; \u00d6rnek bir uygulama \u00fczerinden anlat\u0131yor olmak, san\u0131r\u0131m size konuyu daha rahat anlatabilmemi sa\u011flayacakt\u0131r. Olabildi\u011fince konuya odaklanabilmek ad\u0131na bir Windows Forms uygulamas\u0131 yerine bir konsol uygulamas\u0131n\u0131 ele alal\u0131m;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Threading;\n\nnamespace UygulamaKurtarma {\n    public class Program {\n        private static string kullaniciAdi;\n        private static string sifre;\n\n        static void Main(string[] args) {\n            var kullaniciBilgileriDogru = false;\n\n            while (!kullaniciBilgileriDogru) {\n                Console.Write(\"L\u00fctfen kullan\u0131c\u0131 ad\u0131n\u0131 giriniz : \");\n                kullaniciAdi = Console.ReadLine();\n\n                Console.Write(\"L\u00fctfen \u015fifrenizi giriniz : \");\n                sifre = Console.ReadLine();\n\n                kullaniciBilgileriDogru = KullaniciBilgileriDogruMu(kullaniciAdi, sifre);\n            }\n\n            Console.WriteLine();\n            Console.WriteLine(\"===============================\");\n            Console.WriteLine(\"Uygulamaya ho\u015f geldin, \" + kullaniciAdi);\n\n            Thread.Sleep(60000);\n\n            throw new Exception(\"Hi\u00e7 beklenmedik bir hata\");\n        }\n\n        private static bool KullaniciBilgileriDogruMu(string kullaniciAdi, string sifre) {\n            return kullaniciAdi == \"fatih\" &amp;&amp; sifre == \"1234\";\n        }\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131daki \u00f6rnek konsol uygulamas\u0131 kullan\u0131c\u0131 ad\u0131 ve \u015fifre bilgilerini alarak kontrol etmekte, bilgilerin do\u011fru olmas\u0131 durumunda kullan\u0131c\u0131y\u0131 kar\u015f\u0131lamakta. \u00f6rnek i\u015f mant\u0131\u011f\u0131n\u0131 temsilen uygulama 60 saniye boyunca bekletilmekte, ard\u0131nda da bir hata olu\u015fmakta. Bu uygulamay\u0131 Visual Studio d\u0131\u015f\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131p kullan\u0131c\u0131 ad\u0131 olarak fatih, \u015fifre olarak da 1234 girdi\u011fimizde 60 saniye sonra a\u015fa\u011f\u0131daki ekranla kar\u015f\u0131 kar\u015f\u0131ya kal\u0131r\u0131z;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/uygulama_hatasi.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/uygulama_hatasi_thumb.png\" alt=\"uygulama_hatasi\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; Windows hatay\u0131 fark etmekte ve hata hakk\u0131nda bilgi toplamakta. K\u0131sa bir bekleyi\u015f ard\u0131ndan hata ay\u0131klama ya da program\u0131 kapatma se\u00e7enekleri kar\u015f\u0131m\u0131za gelecektir;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/uygulama_hatasi2.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/uygulama_hatasi2_thumb.png\" alt=\"uygulama_hatasi2\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; Bu durumda, elimizde kaynak kodlar yoksa (<em>ki son kullan\u0131c\u0131da olmayaca\u011f\u0131 kesin<\/em>) program\u0131 kapatmak d\u0131\u015f\u0131nda da bir se\u00e7ene\u011fimiz kalm\u0131yor. Uygulamay\u0131 yeniden ba\u015flatt\u0131\u011f\u0131m\u0131zda, hata \u00f6ncesinde kald\u0131\u011f\u0131m\u0131z noktaya yeniden gelebilmek i\u00e7in yapabilece\u011fimiz tek \u015fey bu bilgileri yeniden vermek olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bu noktadan sonra; uygulamam\u0131za kurtarma deste\u011fi sunabilmek ad\u0131na Application Recovery API\u2019sini kullanabiliriz. Kernel32.dll alt\u0131nda yer alan bu API fonksiyonlar\u0131na a\u015fa\u011f\u0131daki \u015fekilde C# i\u00e7erisinden ula\u015fabiliriz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[DllImport(\"kernel32.dll\", CharSet = CharSet.Auto)]\nstatic extern uint RegisterApplicationRestart(string pwzCommandLine, RestartFlags dwFlags);\n\n[DllImport(\"kernel32.dll\")]\nstatic extern uint RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK pRecoveryCallback, object pvParameter, int dwPingInterval, int dwFlags);\n\n[DllImport(\"kernel32.dll\")]\nstatic extern uint ApplicationRecoveryInProgress(out bool pbCancelled);\n\n[DllImport(\"kernel32.dll\")]\nstatic extern uint ApplicationRecoveryFinished(bool bSuccess);\n\n[Flags]\nenum RestartFlags {\n    NONE = 0,\n    RESTART_CYCLICAL = 1,\n    RESTART_NOTIFY_SOLUTION = 2,\n    RESTART_NOTIFY_FAULT = 4,\n    RESTART_NO_CRASH = 8,\n    RESTART_NO_HANG = 16,\n    RESTART_NO_PATCH = 32,\n    RESTART_NO_REBOOT = 64\n}\n\ndelegate int APPLICATION_RECOVERY_CALLBACK(object pvParameter);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; API\u2019yi kullan\u0131rken yapmam\u0131z gereken ilk i\u015f Windows\u2019a uygulamam\u0131z\u0131n hata durumunda yeniden ba\u015flat\u0131lmay\u0131 istedi\u011fini belirtmektir. Bunun i\u00e7in API i\u00e7erisinde yer alan <strong>RegisterApplicationRestart<\/strong> fonksiyonunu kullanabiliriz. Ard\u0131ndan hata an\u0131nda kurtarma bilgisini saklayabilece\u011fimiz i\u00e7in bu durumu bize bildirecekleri bir geri bildirim fonksiyonu belirtmeliyiz; ki bunu da <strong>RegisterApplicationRecoveryCallback<\/strong> yard\u0131m\u0131yla yapabiliriz. Bu geri bildirim s\u0131ras\u0131nda kurtarma verisini olu\u015fturmak d\u0131\u015f\u0131nda a\u00e7\u0131lm\u0131\u015f olan i\u015fletim sistemleri kaynaklar\u0131n\u0131n kapat\u0131lmas\u0131 da (<em>\u00f6rne\u011fin a\u00e7\u0131k dosyalar\u0131 kapatmak<\/em>) ger\u00e7ekle\u015ftirilebilir. Kurtarma i\u015flemi s\u0131ras\u0131nda da uygulaman\u0131n kilitlenebilece\u011fini ve bir death lock olu\u015fabilece\u011fini hesaba katan i\u015fletim sistemi geli\u015ftiricileri, bu durumu engellemek ad\u0131na, belirli aralarla uygulaman\u0131n yan\u0131t verip vermedi\u011fini kontrol etmekte ve yan\u0131t vermemesi durumunda uygulamay\u0131 sonland\u0131rmaktad\u0131r. Uygulama belirli aral\u0131klarla yan\u0131t verebildi\u011fini kan\u0131tlayabilmek ad\u0131na <strong>ApplicationRecoveryInProgress<\/strong> fonksiyonu yard\u0131m\u0131yla kurtarma i\u015flemini devam etti\u011fini belirtmelidir. T\u00fcm s\u00fcre\u00e7 sona ererek gerekli kurtarma i\u015flemlerinin bitti\u011fi i\u015fletim sistemine <strong>ApplicationRecoveryFinished<\/strong> fonksiyonu yard\u0131m\u0131yla iletilmelidir. Herhangi bir sebeple, uygulamam\u0131z\u0131n kurtarma deste\u011finin kalkt\u0131\u011f\u0131n\u0131n i\u015fletim sistemine belirtmek i\u00e7in ise <strong>UnregisterApplicationRestart<\/strong> fonksiyonu kullan\u0131lmal\u0131d\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; RegisterApplicationRestart fonksiyonu bizden iki parametre isteyecektir;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li> <em>pwzCommandLine<\/em> : Hata sonras\u0131 uygulama yeniden ba\u015flat\u0131l\u0131rken uygulamaya ge\u00e7ilmesi istenen komut sat\u0131r\u0131 parametreleri. Bu parametreler uygulama normal \u015fekilde ba\u015flat\u0131l\u0131rken verilmi\u015f olanlar olabilece\u011fi gibi uygulaman\u0131n bir hata sonras\u0131 yeniden ba\u015flat\u0131ld\u0131\u011f\u0131n\u0131 belirten bir parametre de olabilir. <\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li> <em>dwFlags<\/em> : Yeniden ba\u015flatma tercihini belirtir. <\/li><\/ul>\n\n\n\n<p>&nbsp;&nbsp; Bu bilgileri uygulamam\u0131za uygulayacak olursak Main fonksiyonumuz a\u015fa\u011f\u0131daki \u015fekilde olacakt\u0131r;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private const string HATA_SONRASI_BASLATMA = \"hataSonrasi\";\n\nstatic void Main(string[] args) {\n    var kullaniciBilgileriDogru = false;\n\n    if (args.Length &lt; 0 &amp;&amp; args[0] == HATA_SONRASI_BASLATMA) {\n        Console.ForegroundColor = ConsoleColor.Red;\n        Console.WriteLine(\"Uygulama Hata sonras\u0131 yeniden ba\u015flat\u0131ld\u0131!\");\n        Console.ResetColor();\n\n        bilgileriKurtar();\n\n        kullaniciBilgileriDogru = KullaniciBilgileriDogruMu(kullaniciAdi, sifre);\n    }\n\n    uint islemSonucu = RegisterApplicationRestart(HATA_SONRASI_BASLATMA, RestartFlags.NONE);\n    if (islemSonucu == 0) {\n        Console.ForegroundColor = ConsoleColor.Yellow;\n        Console.WriteLine(\"Uygulama hata kurtarma kayd\u0131 yap\u0131ld\u0131...\");\n        Console.ResetColor();\n\n        islemSonucu = RegisterApplicationRecoveryCallback(HataVeriKurtarma, null, 50000, 0);\n\n        Console.ForegroundColor = ConsoleColor.Yellow;\n        Console.WriteLine(\"Uygulama hata kurtarma geri bildirim kayd\u0131 yap\u0131ld\u0131...\");\n        Console.ResetColor();\n    }\n    else {\n        Console.ForegroundColor = ConsoleColor.Red;\n        Console.WriteLine(\"Uygulama hata kurtarma kayd\u0131 yap\u0131lamad\u0131...\");\n        Console.ResetColor();\n    }\n\n    while (!kullaniciBilgileriDogru) {\n        Console.Write(\"L\u00fctfen kullan\u0131c\u0131 ad\u0131n\u0131 giriniz : \");\n        kullaniciAdi = Console.ReadLine();\n\n        Console.Write(\"L\u00fctfen \u015fifrenizi giriniz : \");\n        sifre = Console.ReadLine();\n\n        kullaniciBilgileriDogru = KullaniciBilgileriDogruMu(kullaniciAdi, sifre);\n    }\n\n    Console.WriteLine();\n    Console.WriteLine(\"===============================\");\n    Console.WriteLine(\"Uygulamaya ho\u015f geldin, \" + kullaniciAdi);\n\n    Thread.Sleep(60000);\n\n    throw new Exception(\"Hi\u00e7 beklenmedik bir hata\");\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi uygulamam\u0131z\u0131n hemen ba\u015f\u0131nda uygulaman\u0131n bir hata sonras\u0131 yeniden ba\u015flat\u0131l\u0131p ba\u015flat\u0131lmad\u0131\u011f\u0131 kontrol edilmekte. Bunu belirlemek i\u00e7in de uygulamaya ge\u00e7ilen bir parametre (<em>HATA_SONRASI_BASLATMA<\/em>) kullan\u0131lmakta. E\u011fer uygulama hata sonras\u0131 yeniden ba\u015flat\u0131ld\u0131 ise veriler <em>bilgileriKurtar<\/em> fonksiyonu yard\u0131m\u0131yla kurtar\u0131lmakta. Bu kontrol sonras\u0131nda ise RegisterApplicationRestart fonksiyonu yard\u0131m\u0131yla i\u015fletim sistemine uygulaman\u0131n hatalarda kurtarma verisi i\u00e7in i\u015flem yapaca\u011f\u0131n\u0131 belirtecektir.&nbsp; Devam\u0131nda RegisterApplicationRecoveryCallback \u00e7a\u011fr\u0131s\u0131 yap\u0131larak hata durumunda tetiklenecek olan fonksiyon belirtilmekte.<\/p>\n\n\n\n<p><strong>RegisterApplicationRecoveryCallback<\/strong> fonksiyonu bizden d\u00f6rt parametre isteyecektir;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li> <em>pRecoveryCallback<\/em> : Hata durumunda tetiklenecek olan fonksiyonu belirtir <\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li> <em>pvParameter<\/em> : Hata durumunda tetiklenecek olan fonksiyona ge\u00e7ilmek istenen bir de\u011fer varsa bu parametre yard\u0131m\u0131yla belirtilebilir. <\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li> <em>dwPingInterval<\/em> : \u0130\u015fletim sisteminin hangi s\u0131kl\u0131kla veri kurtarma i\u015fleminin devam edip etmedi\u011fini kontrol edece\u011fini belirtir, milisaniye olarak verilir. Varsay\u0131lan olarak 5 saniye olan bu parametre, maksimum da 5 dakika olabilir. <\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li> <em>dwFlags<\/em> : \u0130leriye d\u00f6n\u00fck kullan\u0131mlar i\u00e7in ayr\u0131lm\u0131\u015ft\u0131r, 0 de\u011feri verilmelidir. <\/li><\/ul>\n\n\n\n<p>&nbsp;&nbsp; A\u015fa\u011f\u0131da, hata olmas\u0131 durumunda i\u015fletim sistemince \u00e7a\u011f\u0131r\u0131lacak olan HataVeriKurtarma fonksiyonunu bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private static int HataVeriKurtarma(object parametre) {\n    Console.ForegroundColor = ConsoleColor.Yellow;\n    Console.WriteLine(\"Uygulama verileri kurtar\u0131lmak \u00fczere saklan\u0131yor ... \");\n    Console.ResetColor();\n\n    var timer = new Timer(CanliTut, null, 1000, 1000);\n\n    \/\/Kritik veriler saklan\u0131yor\n    using (var kurtarmaVeriDosyasi = File.CreateText(KURTARMA_VERI_DOSYASI_ADI)) {\n        kurtarmaVeriDosyasi.WriteLine(kullaniciAdi);\n        kurtarmaVeriDosyasi.WriteLine(sifre);\n    }\n\n    File.Encrypt(KURTARMA_VERI_DOSYASI_ADI);\n\n    Thread.Sleep(20000);\n\n    ApplicationRecoveryFinished(true);\n\n    return 0;\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Buradaki en kritik nokta veri kurtarman\u0131n bitmesi sonras\u0131nda <em>ApplicationRecoveryFinished<\/em> fonksiyonunun \u00e7a\u011fr\u0131larak i\u015fletim sistemine i\u015flemin bitti\u011finin haber verilmesidir. Hat\u0131rlarsan\u0131z veri kurtarma i\u015flemi s\u0131ras\u0131nda belirli aral\u0131klarla i\u015flemin devam etti\u011finin i\u015fletim sistemine bildirilmesi gerekti\u011finden bahsetmi\u015ftim. Yukar\u0131daki fonksiyonda bu i\u015flem, olu\u015fturulan timer nesnesi \u00fczerinden yap\u0131lmaktad\u0131r. Timer belirli aral\u0131klarla i\u00e7eri\u011fi a\u015fa\u011f\u0131da verilen&nbsp; CanliTut fonksiyonunu tetiklemektedir.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private static void CanliTut(object parametre) {\n    bool islemiIptalEt;\n    ApplicationRecoveryInProgress(out islemiIptalEt);\n\n    if (islemiIptalEt) {\n        Console.ForegroundColor = ConsoleColor.Red;\n        Console.WriteLine(\"Hata veri kurtarma i\u015flemi iptal edildi\");\n        Console.ResetColor();\n\n        Environment.FailFast(\"Hata veri kurtarma i\u015flemi iptal edildi\");\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Dikkat edecek olursan\u0131z bu fonksiyon i\u00e7erisinde i\u015fletim sistemine ApplicationRecoveryInProgress fonksiyonu yard\u0131m\u0131yla i\u015flemin s\u00fcrd\u00fc bildirilmekte. E\u011fer bu i\u015flem s\u0131ras\u0131nda kullan\u0131c\u0131 aray\u00fcz \u00fczerinden i\u015flemi iptal edecek olursa, bu bilgi geri bildirimde uygulamaya iletilmektedir.Uygulama, yukar\u0131da islemiIptalEt parametresinde oldu\u011fu gibi d\u00f6nen de\u011fere g\u00f6re i\u015fleme devam etmeli ya da sonland\u0131rmal\u0131d\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; T\u00fcm bu ad\u0131mlar sonras\u0131nda uygulamam\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda bizi a\u015fa\u011f\u0131daki ekran kar\u015f\u0131layacakt\u0131r;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/hata_kurtarma_oncesi.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/hata_kurtarma_oncesi_thumb.png\" alt=\"hata_kurtarma_oncesi\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Bu ekranda bir s\u00fcre bekledikten sonra uygulamam\u0131zda hata olu\u015facak ve Windows\u2019un hata kurtarma ekran\u0131 kar\u015f\u0131m\u0131za \u00e7\u0131kacak. Bu s\u0131rada Windows uygulamam\u0131z HataVeriKurtarma fonksiyonunu \u00e7a\u011f\u0131racak ve gerekli i\u015flemlerin tamamlanmas\u0131 beklenecektir. Kullan\u0131c\u0131n\u0131n bu ekranda iptal butonuna basmas\u0131 durumunda ise ApplicationRecoveryInProgress \u00e7a\u011fr\u0131s\u0131nda false de\u011feri uygulamaya iletilecek ve uygulaman\u0131n hata kurtarma i\u015flemini sonland\u0131rmas\u0131 beklenecektir.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/hata_veri_kurtarma.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/hata_veri_kurtarma_thumb.png\" alt=\"hata_veri_kurtarma\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; Ba\u015far\u0131l\u0131 bir hata kurtarma sonras\u0131nda, Windows uygulamam\u0131z\u0131 daha \u00f6nceden belirtti\u011fimiz HATA_SONRASI_BASLATMA parametresi ile yeniden ba\u015flatacakt\u0131r. Bu noktadan sonra uygulamam\u0131z bir hatadan kurtar\u0131ld\u0131\u011f\u0131n\u0131 fark ederek gerekli i\u015flemleri yapacakt\u0131r.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/hata_kurtarma_sonrasi.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/hata_kurtarma_sonrasi_thumb.png\" alt=\"hata_kurtarma_sonrasi\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; En basit \u015fekliyle sizlere anlatm\u0131\u015f oldu\u011fum hata veri kurtarma s\u00fcresi \u015f\u00fcphesiz ki ger\u00e7ek uygulamalarda daha karma\u015f\u0131k olacakt\u0131r; ama takip edilecek mant\u0131k temelde ayn\u0131 olacakt\u0131r. Her ne kadar \u00f6rne\u011fimizde kurtar\u0131lmas\u0131 gereken verileri bir text dosyas\u0131nda saklad\u0131ysakta, ger\u00e7ek hayatta bir veritaban\u0131 ya da registery\u2019nin de kullan\u0131lmas\u0131 m\u00fcmk\u00fcnd\u00fcr. A\u015fa\u011f\u0131da, par\u00e7a par\u00e7a aktard\u0131\u011f\u0131m bu uygulaman\u0131n son halini bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Threading;\nusing System.Runtime.InteropServices;\nusing System.IO;\n\nnamespace UygulamaKurtarma {\n    public class Program {\n        #region Data Members\n        private static string kullaniciAdi;\n        private static string sifre;\n\n        private const string HATA_SONRASI_BASLATMA = \"hataSonrasi\";\n        private const string KURTARMA_VERI_DOSYASI_ADI = \"kurtarmaVerisi.txt\";\n        #endregion\n\n        #region Application Recovery API\n        [DllImport(\"kernel32.dll\", CharSet = CharSet.Auto)]\n        static extern uint RegisterApplicationRestart(string pwzCommandLine, RestartFlags dwFlags);\n\n        [DllImport(\"kernel32.dll\")]\n        static extern uint RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK pRecoveryCallback, object pvParameter, int dwPingInterval, int dwFlags);\n\n        [DllImport(\"kernel32.dll\")]\n        static extern uint ApplicationRecoveryInProgress(out bool pbCancelled);\n\n        [DllImport(\"kernel32.dll\")]\n        static extern uint ApplicationRecoveryFinished(bool bSuccess);\n\n        [Flags]\n        enum RestartFlags {\n            NONE = 0,\n            RESTART_CYCLICAL = 1,\n            RESTART_NOTIFY_SOLUTION = 2,\n            RESTART_NOTIFY_FAULT = 4,\n            RESTART_NO_CRASH = 8,\n            RESTART_NO_HANG = 16,\n            RESTART_NO_PATCH = 32,\n            RESTART_NO_REBOOT = 64\n        }\n\n        delegate int APPLICATION_RECOVERY_CALLBACK(object pvParameter);\n        #endregion\n\n        static void Main(string[] args) {\n            var kullaniciBilgileriDogru = false;\n\n            if (args.Length &lt; 0 &amp;&amp; args[0] == HATA_SONRASI_BASLATMA) {\n                Console.ForegroundColor = ConsoleColor.Red;\n                Console.WriteLine(\"Uygulama Hata sonras\u0131 yeniden ba\u015flat\u0131ld\u0131!\");\n                Console.ResetColor();\n\n                bilgileriKurtar();\n\n                kullaniciBilgileriDogru = KullaniciBilgileriDogruMu(kullaniciAdi, sifre);\n            }\n\n            uint islemSonucu = RegisterApplicationRestart(HATA_SONRASI_BASLATMA, RestartFlags.NONE);\n            if (islemSonucu == 0) {\n                Console.ForegroundColor = ConsoleColor.Yellow;\n                Console.WriteLine(\"Uygulama hata kurtarma kayd\u0131 yap\u0131ld\u0131...\");\n                Console.ResetColor();\n\n                islemSonucu = RegisterApplicationRecoveryCallback(HataVeriKurtarma, null, 50000, 0);\n\n                Console.ForegroundColor = ConsoleColor.Yellow;\n                Console.WriteLine(\"Uygulama hata kurtarma geri bildirim kayd\u0131 yap\u0131ld\u0131...\");\n                Console.ResetColor();\n            }\n            else {\n                Console.ForegroundColor = ConsoleColor.Red;\n                Console.WriteLine(\"Uygulama hata kurtarma kayd\u0131 yap\u0131lamad\u0131...\");\n                Console.ResetColor();\n            }\n\n            while (!kullaniciBilgileriDogru) {\n                Console.Write(\"L\u00fctfen kullan\u0131c\u0131 ad\u0131n\u0131 giriniz : \");\n                kullaniciAdi = Console.ReadLine();\n\n                Console.Write(\"L\u00fctfen \u015fifrenizi giriniz : \");\n                sifre = Console.ReadLine();\n\n                kullaniciBilgileriDogru = KullaniciBilgileriDogruMu(kullaniciAdi, sifre);\n            }\n\n            Console.WriteLine();\n            Console.WriteLine(\"===============================\");\n            Console.WriteLine(\"Uygulamaya ho\u015f geldin, \" + kullaniciAdi);\n\n            Thread.Sleep(60000);\n\n            throw new Exception(\"Hi\u00e7 beklenmedik bir hata\");\n        }\n\n        private static bool KullaniciBilgileriDogruMu(string kullaniciAdi, string sifre) {\n            return kullaniciAdi == \"fatih\" &amp;&amp; sifre == \"1234\";\n        }\n\n        private static void bilgileriKurtar() {\n            \/\/Kritik veriler geri okunuyor\n            File.Decrypt(KURTARMA_VERI_DOSYASI_ADI);\n            using (var kurtarmaVeriDosyasi = File.OpenText(KURTARMA_VERI_DOSYASI_ADI)) {\n                kullaniciAdi = kurtarmaVeriDosyasi.ReadLine();\n                sifre = kurtarmaVeriDosyasi.ReadLine();\n            }\n\n            \/\/veriler kurtar\u0131ld\u0131, dosya silinebilir\n            File.Delete(KURTARMA_VERI_DOSYASI_ADI);\n        }\n\n        private static int HataVeriKurtarma(object parametre) {\n            Console.ForegroundColor = ConsoleColor.Yellow;\n            Console.WriteLine(\"Uygulama verileri kurtar\u0131lmak \u00fczere saklan\u0131yor ... \");\n            Console.ResetColor();\n\n            var timer = new Timer(CanliTut, null, 1000, 1000);\n\n            \/\/Kritik veriler saklan\u0131yor\n            using (var kurtarmaVeriDosyasi = File.CreateText(KURTARMA_VERI_DOSYASI_ADI)) {\n                kurtarmaVeriDosyasi.WriteLine(kullaniciAdi);\n                kurtarmaVeriDosyasi.WriteLine(sifre);\n            }\n\n            File.Encrypt(KURTARMA_VERI_DOSYASI_ADI);\n\n            Thread.Sleep(20000);\n\n            ApplicationRecoveryFinished(true);\n\n            return 0;\n        }\n\n        private static void CanliTut(object parametre) {\n            bool islemiIptalEt;\n            ApplicationRecoveryInProgress(out islemiIptalEt);\n\n            if (islemiIptalEt) {\n                Console.ForegroundColor = ConsoleColor.Red;\n                Console.WriteLine(\"Hata veri kurtarma i\u015flemi iptal edildi\");\n                Console.ResetColor();\n\n                Environment.FailFast(\"Hata veri kurtarma i\u015flemi iptal edildi\");\n            }\n        }\n    }\n}<\/pre>","protected":false},"excerpt":{"rendered":"<p>&nbsp;&nbsp; En hatas\u0131z yaz\u0131lan uygulamalar bile zaman zaman hata vererek sonlanabilir, bu hepimizin bildi\u011fi bir ger\u00e7ektir. Uygulamalar\u0131m\u0131zda bir hata tespit etti\u011fimizde yap\u0131lacak en do\u011fru \u015fey, \u015f\u00fcphesiz ki, bu hatay\u0131 d\u00fczelmek olacakt\u0131r. Peki biz bunu yapana kadar son kullan\u0131c\u0131lar ne ya\u015f\u0131yorlar? D\u00fc\u015f\u00fcn\u00fcn bir kere; bilgisayar\u0131n\u0131za bir uygulama kurdunuz, pek \u00e7ok i\u015flem yapt\u0131n\u0131z; fakat i\u015flerinizi kaydetmeden hemen&#8230;<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/fatihboy.com\/en\/uygulama-kurtarma\/\">Read More<\/a><\/p>","protected":false},"author":1,"featured_media":33583,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,28],"tags":[41,118],"class_list":["post-9048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-csharp","category-turkce","tag-c","tag-hata-ayiklama"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C# ile Uygulama Kurtarma - Fatih Boy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihboy.com\/en\/uygulama-kurtarma\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# ile Uygulama Kurtarma - Fatih Boy\" \/>\n<meta property=\"og:description\" content=\"&nbsp;&nbsp; En hatas\u0131z yaz\u0131lan uygulamalar bile zaman zaman hata vererek sonlanabilir, bu hepimizin bildi\u011fi bir ger\u00e7ektir. Uygulamalar\u0131m\u0131zda bir hata tespit etti\u011fimizde yap\u0131lacak en do\u011fru \u015fey, \u015f\u00fcphesiz ki, bu hatay\u0131 d\u00fczelmek olacakt\u0131r. Peki biz bunu yapana kadar son kullan\u0131c\u0131lar ne ya\u015f\u0131yorlar? D\u00fc\u015f\u00fcn\u00fcn bir kere; bilgisayar\u0131n\u0131za bir uygulama kurdunuz, pek \u00e7ok i\u015flem yapt\u0131n\u0131z; fakat i\u015flerinizi kaydetmeden hemen...Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihboy.com\/en\/uygulama-kurtarma\/\" \/>\n<meta property=\"og:site_name\" content=\"Fatih Boy\" \/>\n<meta property=\"article:published_time\" content=\"2011-07-16T20:20:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-06-19T06:29:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"1012\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Fatih Boy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Boy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/\"},\"author\":{\"name\":\"Fatih Boy\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"headline\":\"C# ile Uygulama Kurtarma\",\"datePublished\":\"2011-07-16T20:20:00+00:00\",\"dateModified\":\"2021-06-19T06:29:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/\"},\"wordCount\":1518,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg\",\"keywords\":[\"C#\",\"Hata Ayiklama\"],\"articleSection\":[\"C#\",\"T\u00fcrk\u00e7e\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihboy.com\/uygulama-kurtarma\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/\",\"url\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/\",\"name\":\"C# ile Uygulama Kurtarma - Fatih Boy\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg\",\"datePublished\":\"2011-07-16T20:20:00+00:00\",\"dateModified\":\"2021-06-19T06:29:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihboy.com\/uygulama-kurtarma\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/#primaryimage\",\"url\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg\",\"contentUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg\",\"width\":1800,\"height\":1012},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihboy.com\/uygulama-kurtarma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fatihboy.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C# ile Uygulama Kurtarma\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihboy.com\/#website\",\"url\":\"https:\/\/fatihboy.com\/\",\"name\":\"Fatih Boy\",\"description\":\"Ki\u015fisel Web Sitesi\",\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihboy.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\",\"name\":\"Fatih Boy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"caption\":\"Fatih Boy\"},\"logo\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/fatihboy.com\"],\"url\":\"https:\/\/fatihboy.com\/en\/author\/fatih\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C# ile Uygulama Kurtarma - Fatih Boy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihboy.com\/en\/uygulama-kurtarma\/","og_locale":"en_US","og_type":"article","og_title":"C# ile Uygulama Kurtarma - Fatih Boy","og_description":"&nbsp;&nbsp; En hatas\u0131z yaz\u0131lan uygulamalar bile zaman zaman hata vererek sonlanabilir, bu hepimizin bildi\u011fi bir ger\u00e7ektir. Uygulamalar\u0131m\u0131zda bir hata tespit etti\u011fimizde yap\u0131lacak en do\u011fru \u015fey, \u015f\u00fcphesiz ki, bu hatay\u0131 d\u00fczelmek olacakt\u0131r. Peki biz bunu yapana kadar son kullan\u0131c\u0131lar ne ya\u015f\u0131yorlar? D\u00fc\u015f\u00fcn\u00fcn bir kere; bilgisayar\u0131n\u0131za bir uygulama kurdunuz, pek \u00e7ok i\u015flem yapt\u0131n\u0131z; fakat i\u015flerinizi kaydetmeden hemen...Read More","og_url":"https:\/\/fatihboy.com\/en\/uygulama-kurtarma\/","og_site_name":"Fatih Boy","article_published_time":"2011-07-16T20:20:00+00:00","article_modified_time":"2021-06-19T06:29:21+00:00","og_image":[{"width":1800,"height":1012,"url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg","type":"image\/jpeg"}],"author":"Fatih Boy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatih Boy","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/#article","isPartOf":{"@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/"},"author":{"name":"Fatih Boy","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"headline":"C# ile Uygulama Kurtarma","datePublished":"2011-07-16T20:20:00+00:00","dateModified":"2021-06-19T06:29:21+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/"},"wordCount":1518,"commentCount":1,"publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"image":{"@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg","keywords":["C#","Hata Ayiklama"],"articleSection":["C#","T\u00fcrk\u00e7e"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihboy.com\/uygulama-kurtarma\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/","url":"https:\/\/fatihboy.com\/uygulama-kurtarma\/","name":"C# ile Uygulama Kurtarma - Fatih Boy","isPartOf":{"@id":"https:\/\/fatihboy.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/#primaryimage"},"image":{"@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg","datePublished":"2011-07-16T20:20:00+00:00","dateModified":"2021-06-19T06:29:21+00:00","breadcrumb":{"@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihboy.com\/uygulama-kurtarma\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/#primaryimage","url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg","contentUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/07\/life-saving-ring.jpg","width":1800,"height":1012},{"@type":"BreadcrumbList","@id":"https:\/\/fatihboy.com\/uygulama-kurtarma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fatihboy.com\/"},{"@type":"ListItem","position":2,"name":"C# ile Uygulama Kurtarma"}]},{"@type":"WebSite","@id":"https:\/\/fatihboy.com\/#website","url":"https:\/\/fatihboy.com\/","name":"Fatih Boy","description":"Ki\u015fisel Web Sitesi","publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihboy.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158","name":"Fatih Boy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","caption":"Fatih Boy"},"logo":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/fatihboy.com"],"url":"https:\/\/fatihboy.com\/en\/author\/fatih\/"}]}},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/9048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/comments?post=9048"}],"version-history":[{"count":1,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/9048\/revisions"}],"predecessor-version":[{"id":33584,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/9048\/revisions\/33584"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media\/33583"}],"wp:attachment":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media?parent=9048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/categories?post=9048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/tags?post=9048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}