Wep Api ile RequestHeader okuma

Requestler header, method, content  vs birden çok bilgi içeriyorlar (Http Request).

Peki headerdaki bir değere, Web api metodunda nasıl kullanışlı bir biçimde erişebiliriz.

İlk akla gelen Request objesi üzerinden headers a ulaşmak , şöyle ki :

her erişmek istediğimizde bu kodu yazmak yerine ihtiyaç olan yerlere HttpParameterBinding kullanarak erişmek, parametre için type  (int, string vs) casting işlemlerini merkezi bir şekilde yönetmek için web api nin nimetlerinden yararlanırsak:

 

Parametrelerde binding yapabilmek için ParameterBindingAttribue kullanırız.

Bu attribute kullanırken constructor da belirtildiği gibi requestHeader da hangi isimde parametre geleceğini söylememiz gerekiyor.

Örnek :

Eğer sıkça kullanmamız gereken ya da string olarak header name belirttiğimiz için yanlış yazma durumu oluşmamasını istediğimizde ise FromHeaderAttribute’den miras alarak özelleşmiş tipleri yapabiliriz.

Örnek :

Yukardaki LanguageHeaderAttribute sınıfı “Language” isminde request header değeri arayacak ve onun ilk değerini (string listesi olarak geldiği için ilkini almıştık) metod parametrelerinden belirtilene binding yapacaktır.

Örnek :

Metod içerisinde lang değerinin headerdan okunup getirildiğini uygulamanızda görebilirsiniz.

 

 

Asp.Net 400 Hata Koduyla Json Mesaj Dönme

Aşağıdaki kod parçasını 400 (Bad Request) le beraber Json mesaj dönmek için kullanıyoruz.

 

Localhost için gayet güzel çalışırken Azure ya da sunucu üzerine deploy ettiğinizde sürekli “Bad Request” hatası alıp içeriğinde ise yazdığımız Json bilgisi olmayabilirBunun başlıca sebebi IIS in belirttiğiniz hata kodu (burdaki 400) için sizin response değerini eziyor olmasıdır.

Çözüm:

  1. Web.config içerisine aşağıdaki satırları eklemek
  2. Kod içerisinde Response.TrySkipIisCustomErrors = true; set etmek.

Daha fazlası için:

http://msdn.microsoft.com/en-us/library/ms690576(v=vs.90).aspx

Google PDF İndirme

Google Docs, Google’un epey çokca bulunan bulut hizmetlerinden sadece biri. Burda bildiğiniz üzere envai çeşit dökümanları düzenleme ve paylaşma imkanına sahibiz.

Paylaşım yaparken güvenlik de önemli bir etken tabiki. Eğer görüntüleme yetkisi vermediğimiz birisi bizim dökümana erişmeye çalışırsa aşağıdakine benzer bir ekran görecektir.

izin

Peki görüntüleme iznimiz varsa fakat indirme engellendiyse.

izin3

İşte bu durumda ilgili dökümanı görüntüleme izni olan biri açtığında NŞA’da indirme yapamayacaktır.

Bu kadar Google Docs eğitiminden sonra olayımıza dönersek  😉

Bu PDF bana lazım! Nasıl indireceğim ?  sorularının cevabına gelelim.

1- Olay Yeri İnceleme

  • Bu PDF browserda nasıl görüntüleniyor ki acaba?
    • Indirme linkini Google belki sayfada unutmuştur  ordan bulur bir şeyler serviste de kontrol yoksa indiririz 😛
    • Muhtemelen JavaScript’ler akıyordur  :mrgreen:  (Ya obfuscated ise ? )
    • Resim olabilir.
    • vs

Tüm bu akıldakı sorulara yardım yine geliştiri araçlarından geliyor.

Sayfayı aşağıya doğru scroll ettikçe belgenin yüklendiğini görüyoruz.  Ayrıca JavaScriptlerin içerisinden çıkmak oldukça zor o yüzden fazla kasmadan “Networks” tabına geçiş yaparak bu scroll edince acaba ne oluyor ki diye bakıyoruz.

izin4

O da ne 🙄 ?

İncelemeye devam…

izin5

 

Anlaşıldığı üzere bayağı GET request ile ilgili sayfamızın resmini Google abi bize dönüyor 🙂

 

Bu request URLsi ise : https://drive.google.com/viewerng/img?id=ACFrOgDZ24CTOuTnAmnLTf-P_pQhCycVfMBU-_yS-pM5hEMa2mnOmHJcM3os-dRJiP5tyVLAiDgFwsG4sqeyMhQ-N0n9GzKV9Rl2oLMz0Sty8kYlyK9Eag4C2lYwOg0=&u=0&w=800&webp=true&page=10

bayağı karmaşık Id değerleri vs olsa da page ile oynayınca o sayfanın geldiğini görüyoruz  :mrgreen:  O kadar Id koymuşsun page’i de Hash yapsana ! (iyi ki yapmamış 🙂 )

2- Kodlama

Birden çok yöntem olabileceği gibi basitçe HttpWebRequest sınıfını kullanarak sayfaya talepte bulunup gelen stream veriyi de Image sınıfı aracılığıyla kayıt edelim. 

Request URL’si karmaşık Id değerleri ile geçici olarak oluşturulduğu için uygulama içerisinden o sayfaya önce giriş yapmanız gerekebilir. Giriş yaptıktan sonra ilk aşamadaki yöntemle tekrar url’inizi öğrenebilirsiniz. Eğer giriş yapmadan .Net uygulama içerisinde istekte bulunmak istiyorsanız Internet Explorer ile PDF ‘in olduğu sayfada request url‘ini öğrenmeniz yeterlidir.

PDF’in 59 sayfa oldugunu varsayalım. Buna göre aşağıdakine benzer basit bir kod ile sayfaları indirelebiliriz.

Örnek çıktı:

izin6

Artık elinizde istediğiniz PDF’in resim hali mevcut, yazı halini ister OCR araçları isterseniz de HAP(Html Agility Pack) ile elde edebilirsiniz.

Resimlerden PDF oluşturmak için de kod yazabilir ya da online siteleri (bkz: https://online2pdf.com/convert-images-to-pdf) kullabilirsiniz.

C# ve Native

Native uygulamalar,  makine koduna dönüştürülmüş kodları içermektedir. Örneğin C/C++ ile geliştirilmiş bir programlar nativedir.

.Net tarafında native olarak yazılmış kütüphaneleri kullanabilmek için Windows’un apilerinden yararlanılmaktadır. Native metodların .net tarafında kullanmak için farklı yöntemler mevcut fakat burda anlatılacak olan sarmalama (wrapping) ile kullanımına dairdir.

Örnek olarak aşağıda C ile yazılmış toplama işlemi yapan bir kütüphanenin(.lib) C# tarafından kullanılmasına bakarsak;

Öncelikle kütüphaneyi oluşturuyoruz.

native1

Static library’i seçiyoruz. Burda Shared Library ya da Dynamic Link Library seçerseniz DLL üretebilirsiniz fakat anlatacığım yöntemde biz sarmalama (wrapping) yapacağımız için .lib seçiyoruz.

native2

Proje ismini ve diğer detayları belirliyoruz.

 native3

Yukardaki kod otomatik oluşturulmakta. Mâşallah bunu yazan arkadaş da çok dertliymiş 🙂

Süper metodumuzu zaten kendileri bizim için yazmış “SampleAddInt” adında. Geriye kalan metod ve yorum satırlarını temizliyoruz. Sarmala yapacağımız projede kullanılacak metodların bildirimlerini eklenen header (.h) dosyasında yapıyoruz.

ToplamaLib.h :

__cplusplus ve extern “C” ile link(bağlama) işlemini yapan C++ derleyicisine işlemini C’e göre yapmasını söylüyoruz. Çünkü metod C ile kodlandı.

TOPLAMALIB_H_INCLUDED kullanarak metod prototipin bir kere yazıldıktan sonra bir daha geçmemesi için kullanılıyor. Amacı başka bir yerden çağrıldıysa header dosyası derleme zamanı hata almamak için eklenir burda eklemesek de olur çünkü sadece tek bir .c dosyasında kullanılacak.

ToplamaLib.c :

#include ile başlık/header (.h) dosyasının dahil edilmesini sağlıyoruz ve SampleAddInt metodu tanımlaması yapılıyor.

Projeyi derliyoruz ve derlemenin sonuçlandırıldığı dizinde aşağıdakine benzer bir görünüm elde ediyoruz.

native7

“libToplamaLib.a” dosyasını “libToplamaLib.lib” olarak yeniden adlandırıyoruz. Çünkü Visual Studio .lib dosyası beklemektedir(Windows olduğu için). Derleyici lib dosyasını .a ile oluşturmuş olmasına rağmen .lib ile aynı özelliklere sahip olmakta. Bu uzantıda oluşmasının nedeni Code Blocks varsayılan derleyicisi GCC olduğu için .a olarak oluşturuyor.

Visual studio ile Class Library projesi oluşturuyoruz. Bu proje ile .lib uzantılı kütühanenin metodlarını çağırabilecek ve sarmalama yapabileceğiz.

native4

Projeye sağ tıklayarak “Properties” penceresine ulaşabilirsiniz. Burda aşağıdaki ayarları yaparak “ToplamaLib.h” dosyasını dahil edebilmeyi sağlıyoruz.

native5

 native6

Yukardaki işlemleri yaptıktan sonra #include önişlemci komutu kullanarak artık “ToplamaLib.h” header dosyasını dahil edebiliriz. (Yukardakileri yapmadan da tam yolu vererek yapılabilirdi)

native8

Projenin link aşamasında C ile yazılmış Static Library ‘i yani .lib dosyasını kullanabilmesi için aşağıdaki adımlar takip ediyoruz.

native11

native12

.lib dosyasının tam yolunu veriyoruz.

 

Wrapper’ın header dosyasında Sınıf adını yazıp, metodların bildirimlerini yapıyoruz.

Aşağıda Sınıf adı “Function” ve int dönen, 2 tane int parametre alan “AddInt” metodu bildirimi yapılmış.

native9

Bildirimi yapılan metodu “ToplamaLibWrapper.cpp” dosyasında C++ kodu ile tanımlamasını yapıyoruz. Bu tanımlamada C ile yazılan kütüphane fonksiyonun çağrıldığına dikkat edilmesi gerek. Bu sayede wrapping (sarmalama) işlemi gerçekleştiriliyor.

native10

Projeyi derliyoruz ve derlenen çıktının olduğu yerde .DLL oluşmuş olduğunu görmemiz gerekiyor.

native13

Artık bu DLL’i .Net uygulamalarına referans olarak ekleyerek kullanabiliriz.

Örnek olması maksadıyla bir Windows Form projesi açıyor ve düzenliyoruz.

native14

Üstün tasarım yetenekleriyle aşağıdakine benzer bir tasarım yapabilirsiniz  😀

native15

Kütüphaneyi kullanabilmek için projeye sağ tıklayıp “Add Reference” seçeneğiyle açılan pencereden oluşturduğumuz sarmalayıcı DLL’i ekliyoruz.

native16

DLL’i ekledikten sonra Topla butonuna DLL’deki metodu çağıracak kodu ekliyor ve uygulamayı test ediyoruz.

native17

 

Eğer “BadImageFormatException” , “…dosyasını veya derlemesini ya da bağımlılıklarından birini yükleyemedi. Geçersiz biçimdeki bir program yüklenmek istendi.” gibi aşağıdaki hatanın alınması durumunda (x64 sistemlere alınması daha muhtemel):

native18

Proje özelliklerine sağ tıklayarak Build sekmesi altından Target Platform x86 olarak değiştirildiğinde sorun olmamaktadır.

native19

UI projesinde platform değiştilmek istenmiyorsa Wrapper projesinde ayarlama yapılması gerekir.

 

Karma mod çalışma hatası çözümü

Başka DLL’ler kullanan bir proje derlenip çalıştırıldığında;

Mixed mode assembly is built against version ‘v2.0.50727’ of the runtime and cannot be loaded in  … 

ya da

Karma mod derleme çalışma zamanının ‘v2.0.50727’ sürümü için oluşturuldu ve ek yapılandırma bilgileri olmadan 4.0 çalışma zamanına yüklenemez.

hatası alındığında yapılması gereken yeni bir app.config dosyası eklemek. Bu dosyanın içeriği şuna benzer olmalı :