Archive

Archive for the ‘C#’ Category

.NET Platformundan Windows Fax ile Faks Göndermek

August 5th, 2010 10 comments

Bir müşterimizin isteği/ihtiyacı ile geliştirdiğimiz internet tabanlı uygulamanın, doğrudan faks göndermesi ihtiyacı doğdu. İlk önce uzunca bir süre farklı Fax Server arayışlarında bulundum. Ancak Windows platformu için başarılı (mümkünse açık kaynak kodlu veya ücretsiz) bir Fax Server bulmak mümkün olmadı.
Daha sonra odağımı, Windows’un kendi faks çözümü olan Windows Fax’a kaydırdım. Biraz araştırma sonrası, faxcom.dll kütüphanesi aracılığı ile (Windows 2000 kurulu bir bilgisayarın c:\WINNT dizininden bulabilir veya Windows 2000 CD’sinden deflate edebilirsiniz) gönderim yapmanın mümkün olacağını öğrendim. Çok umutlu olmasam da denemelere başladım. İlk önce denemeleri bir masaüstü uygulamada yaptım. Aşağıdaki kod parçasıyla yaptığım denemeler kesin bir başarıyla sonuçlandı;

FaxServerClass fs = new FaxServerClass();
fs.Connect(machineName);
object obj = fs.CreateDocument(documentPath);
FaxDoc fd = (FaxDoc)obj;
fd.FaxNumber = dialPrefix + faxNumber;
fd.SenderName = senderName;
fd.RecipientName = recName;
int result = fd.Send();
fs.Disconnect();
fs = null;

Kodda kullanılan değişkenler;

  • documentPath: Faks gönderilecek dokümanın tam yolu.
  • machineName: Windows Fax’ın kurulu olduğu makinenin adı. Aynı makine üzerindeyseniz Environment.MachineName de kullanabilirsiniz (sadece desktop uygulamalarında)
  • dialPrefix: Faks gönderileri santral üzerinden çıkacaksa ihtiyaç duyacağınız hat alma ön eki.
  • faxNumber: Alıcı faks numarası.
  • senderName: Gönderenin isim bilgisi (faks ile beraber gönderiliyor).
  • recName: Alıcının görünecek ismi (faks konsolunda görünür).

Bu basit kod parçası ile geliştirme ve deneme ortamım Windows 7′de faks gönderimi başarıyla sonuçlandı, faks kuyruğuna dokümanlarım düştü. Daha sonra web uygulaması üzerinden denemeler başladım. Aşağıda bahsedeceğim bir kaç yetki probleminden sonra onda da (Windows 2003 üzerinde) tam başarı elde ettim. Ancak bazı noktaları belirtmekte fayda var;

  1. Faks göndermek istediğiniz dokümanın faks olarak gönderilebilmesi için, bu format ile birlikte açılmaya ayarlanmış bir uygulamanın kurulu olması gerekiyor. Aynı zamanda bu uygulamanın Shell-Print destekliyor olması gerekiyor. Küçük bir tavsiye; göndereceğiniz formatı açıp yazdıran uygulamayı ne kadar hafif seçerseniz o kadar az kaynak kullanırsınız. Örneğin PDF’te Adobe Acrobat’ın bazen bellekte kaldığına şahit oldum.
  2. Gönderimi yapacak faks sunucusunun normalde aynı makinede olması gibi bir zorunluluk söz konusu değil. Fully-qualified ağ adı sağladığınız sürece bu kodun çalışması beklenir. Ancak ben yaptığım hiç bir denemede farklı sunucuya erişim için gerekli yetki ayarlarını bulamadım. E_ACCESSDENIED hatasından öteye gitmem mümkün olmadı. Büyük ihtimalle RPC tüneli gereken bu uygulama için eğer zorunlu değilseniz çok uğraşmayın derim. Eğer çözümünü bulup yorum olarak postalayan olursa da memnuniyetle yayınlarım.

    Aynı makine üzerine kurulu bir ASP.NET web uygulamasından aynı kodla gönderim yapmak istediğimde yine E_ACCESSDENIED hatası aldım. Impersonation ile sorunu çözmeye muvaffak olamayınca kurulu faksın yetkileri ile ilgilenmeye başladım ve çözüme ulaştım. Windows 2003′te, “Printers and Faxes” üzerinden eriştiğim Faks simgesine çift tıkladığınızda görüntülenen konsoldan “Tools” menüsünden “Fax Service Manager…” seçin.

    Daha sonra açılacak “Microsoft Fax Service Manager” üzerinde, kök “Fax (Local)” yaprağını bulup sağ tık ile “Properties” ekranına erişin ve “Security” sekmesinden, ekleyeceğiniz “NETWORK SERVICE” kullanıcısına yetki verin. Web uygulaması olduğu için bu kullanıcıyı seçtik. Farklı bir uygulama olsa çağıdan kullanıcıyı seçecektik tabi ki. Bu ayardan sonra Windows 2003 üzerinde ASP.NET uygulamam da sorunsuz olarak faks gönderebilmeye başladı. Ancak bu çözümü Windows 7 üzerinde uygulama şansım olmadı, zira “Microsoft Fax Service Manager”a karşılık gelen uygulamayı bulamadım. İhtiyacım olan Windows 2003 olduğu için bu çözüm bana yeterli oldu.

  3. Faksı santral üzerinden çıkacaksanız ve hat alma ön eki kullanıyorsanız, ön ekten sonra çevir sesini beklemek için bir veya daha fazla defa virgül (,) kullanmanız gerekebilir. Kaç virgül kullanacağınızı santralinizin hat verme hızına göre tespit etmelisiniz. Bir virgül yaklaşık 0.5 saniye beklemeye sebep oluyor. Yani çevirdiğiniz faks numarası sonuç olarak (prefixiniz 9 ise) 9,,,4445566 gibi olmalı. Bu örnek yaklaşık 1.5 saniye hat bekleyecektir.
  4. Alıcı ve gönderici isimlerinin gönderi üzerinde çıkıp çıkmaması, hem sizin fax-modem kartınıza, hem de alıcı cihazın özelliklerin bağlı. İki bilgi de çıktıya eklenebileceği gibi ikisi de görünmeyebilir.
  5. Faks nesnesinde benim burada değinmediğim daha bir çok seçenek mevcut (kapak sayfasından alıcı/gönderici detay bilgilerine kadar). Bunları da gözden geçirmenizi tavsiye ederim.

Son olarak belirtmek istediğim bir nokta var. Normalde fax server’a faksı basmak senkron bir işlem değil. Asenkron olarak komut basılıp geçiyor. Ancak uygulamalarımda şunu gördüm ki; faks servisinin durumuna, dokümanın büyüklüğüne vb. göre faks’ın kuyruğa basılması kimi zaman bir kaç saniyeyi geçebiliyor. Bu yüzden uygulamalarda faks gönderimini (işlem unattanded gerçekleşecekse) doğrudan yapmak, uygulamanın yavaşlamasına ve web uygulamlarının zaman aşımına düşmesine sebep olabilir. Bunun önüne geçmek için bir Windows servis veya periyodik çalışacak bir konsol uygulaması geliştirmeyi düşünebilirsiniz.

Müşterimiz için olan uygulamamızda ben bunu tercih ettim. Windows servisin bakım ve idamesi daha zor olduğu için bir konsol uygulaması yapıp, bunu “Scheduled Job” ile periyodik çalıştırıp bir dizinde çekilecek faksları tarayıp göndermeyi tercih ettim. Size de tavsiyem bu yönde olur.

Umarım siz de yandaki gibi dolu bir faks konsolu giden kutusuna sahip olursunuz.

Herkese keyifli fakslamalar :)

NicEdit ve C#

December 30th, 2009 2 comments

Geçtiğimiz günlerde yaptığımız bir proje için basit ama yetenekli bir HTML editor ihtiyacımız oldu. Bundan önce bir çok seçenek denemiş ve değerlendirmiştik. Genellikle basit olanların özellikleri yetersiz, yetenekli olanalrda çok ağır ve hantal çalışmaktaydı. Ancak projenin doğası gereği ihtiyacımız hem implementasyonu hem de kendisi hafif, aynı zamanda da “dosya yükleme” gibi (nispeten) ağır işlemleri yapabilen bir bileşene ihtiyacım oldu.

İnternette yaptığım aramada, NicEdit’in (http://nicedit.com) güzel bir seçenek olduğunu gördüm. Özellikle, jQuery tarzı, sadece ihtiyacınıza göre özelleşebilen, daha küçük boyutlu js dosyaları alabildiğiniz yapısı, hem altyapının gücünün hem de başarılı bir bileşenin habercisiydi.

Gerçekten de bileşeni uyguladığımda, hem hafif hem de başarılı olduğu konusundaki fikrimde yanılmadığım ortaya çıktı. Tek sorun, dosya yükleme konusundaydı. Aslında içindeki dosya yükleme rutininde herhangi bir sorun bulunmuyor. Varsayılan ayarlarla kurulum yaptığınızda, resimleri ImageShack üzerinde host ederek, güzel bir yükleme arabirimiyle işini doğru şekilde yapıyor. Ancak uygulamamın tarzı sebebi, resimlerin ImageShack üzerinde değil, kendi sunucumuzda tutulması gerekiyordu. NicEdit, parametrik olarak yükleme işlemlerini farklı bir adrese yönlendirme opsiyonu sağlıyor. Bunun için de örnek olarak bu özelliği karşılayacak bir sayfa sunulmuş. Ancak örnek sayfa PHP ile kodlanmıştı. Benim tabi ki C# koda ihtiyacım vardı. PHP’den hiç anlamadığım için, kodu okuyarak çözmek yerine, gelen giden istekleri takip edip Firebug yardımıyla çalışma mantığını çözmeye karar verdim. Sonuç olarak NicEdit ile uyumlu çalışan, C# tabanında bir dosya yükleme karşılama sayfası yapmayı başardım.

Doğrusunu söylemek gerekirse bütün özellikleri desteklemedim. Örneğin yükleme yüzdesinin ne kadar olduğunu gösteren özelliği implemente etmedim. Aslında mümkündü ancak ihtiyacım olmadığı için yapmadım. “Dosya yükleniyor” ibaresi benim için yeterliydi. Gönderilen cevaptaki bütün parametreleri de incelemedim. Sadece kendime yarayacak kısımları düzelttim, geri kalanları sabit olarak gönderdim.

Eğer siz de bir ASP.NET projesinde dosya yükleme özelliği ile NicEdit kullanmak istiyorsanız, yaptığım basit geliştirmeyi SVN üzerinden svn checkout http://nicedit-csharp-fileupload.googlecode.com/svn/trunk/ nicedit-csharp-fileupload-read-only komutuyla checkout edebilirsiniz. Web üzerinden de http://code.google.com/p/nicedit-csharp-fileupload adresinden projede gezinebilirsiniz. Yükleme işlemi tek bir aspx dosyasında yapılıyor. General.cs dosyası içerisindekiler ise, yükleme işlemlerinin listesinin tutulduğu bir class. Ayrıca fark edeceğiniz gibi bazı parametreler web.config’den alınıyor. Onları da konfigüre ettiğinizde kullanıma geçmeniz 2-3 dakikanızı alacaktır.

Umarım işinize yarar…

Categories: ASP.NET, C# Tags: , , , ,