Posts Tagged ‘Asp.Net’
ASP.Net uygulamalarında ConnectionString’i şifrelemek
ASP.Net uygulamalarımızda en çok kullandığımız yöntemlerden biri, connectionString’i web.config dosyası içerisinde tanımlamak. Bu sayede tekrardan derlemeye gerek kalmadan uygulamamızın veri tabanı sunucusunu değiştirme şansına sahip olmaktayız. Aynı zamanda tek yerden yapılan güncelleme kod içerisinde connectionstring arama derdinden bizi kurtarmakta. Bu özellik gerçekten güzel gibi ama bazen bu bağlantının meraklı gözlerden saklanması gerekebilir. Bunun için web.config içerisindeki bazı alanların şifrelenebilmesi mümkündür. Önce şifreleyebileceğimiz alanlara bakalım :
-
<connectionStrings>
-
<processModel>
-
<runtime>
-
<mscorlib>
-
<startup>
-
<system.runtime.remoting>
-
<configProtectedData>
-
<satelliteassemblies>
-
<cryptographySettings>
-
<cryptoNameMapping>
-
<cryptoClasses>
Şifreleme 2 ayrı yöntem ile yapılabilir.
1. Yöntem
İlk yöntemimiz aspnet_regiis.exe programını kullanmak. Bu yöntemde web.config dosyasını şifreleyeceğiniz sunucuya bağlı olmanız veya kendi test makinanızda çalışıyor olmanız lazım. Çünkü bu uygulamayı çalıştırabilmek için web sitesinin bulunduğu makinada Dos Komut İstemi açmanız gerekecek. Gelelim işlemin nasıl yapılacağına :
1. Önce web sitesinin bulunduğu makinada bir Dos Komut İstemi (Command Prompt) açalım. İşi sağlama almak için Yönetici olarak açmayı(Run as administrator) seçebiliriz. ( Start -> All Programs -> Accessories -> Command Prompt -> Sağ tık -> Run as Administrator )
2. Açılan pencerede
veya
yazıp enter’e basarız. böylece programın yer aldığı dizine varırız.
3. Artık şifreleme veya açma işine başlayabiliriz.
a) Şifreleme : aspnet_regiis.exe’nin -pe parametresini kullanarak yapılır. pe parametresinden sonra şifrelemek istediğiniz xml elemanını belirtirsiniz. Mesela connectionStrings gibi. Kullanılabilecek değerleri yukarıdaki listede vermiştim. Ayrıca buna ek olarak kullanmamız gereken bazı alt parametreler daha var :
-site parametresi : hangi sitenin web.config dosyasını şifreleyeceğimizi belirtir.
-app parametresi : site içindeki hangi uygulamanın şifreleneceğini belirtir.
-prov parametresi : şifreleme için kullanılacak provider’ı belirtir. bu parametre için DataProtectionConfigurationProvider değeri kullanılır.
Tam olarak yazımına bakarsak :
Böylece web.config dosyasının içindeki connectionStrings alanının şifrelendiğini görürüz.
b) Şifreyi Açma : aspnet_regiis.exe’nin -pd parametresini kullanarak yapılır. pd parametresinden sonra şifresini açmak istediğiniz xml elemanını belirtirsiniz. Mesela connectionStrings gibi. Kullanılabilecek değerleri yukarıdaki listede vermiştim. Ayrıca buna ek olarak kullanmamız gereken bazı alt parametreler daha var :
-site parametresi : hangi sitenin web.config dosyasını şifreleyeceğimizi belirtir.
-app parametresi : site içindeki hangi uygulamanın şifreleneceğini belirtir.
Tam olarak yazımına bakarsak :
Böylece web.config dosyasının içindeki connectionStrings alanının şifresinin çözüldüğünü görürüz.
2. Yöntem
Kod ile aynı işlemi yapabilmekte mümkündür. Özellikle hosting gibi yerlerde bize makinada uzak bağlantı açma hakkı verilmez. Bu yüzden istediğimiz işlemleri dos komut istemi ile yapmamız mümkün olmaz. Böyle durumlarda kod ile de istediğimiz sonuca ulaşabiliriz. Öncelikle web.config dosyamızı açmamız gerekiyor. bunun için :
kodunu kullanırız. Sonrada üzerinde şifreleme veya açma yapacağımız xml bölgesine ulaşmamız lazım.
connectionStrings yerine yukarıdaki listede yer alan herhangi bir elemanı da kullanabilirsiniz. Bu noktada ilerlemeden önce section içinde veri olup olmadığını kontrol etmek gerekir. Eğer null değer içerir ise bir sonraki işlemimizde hata oluşur.
section nesnemizin özellikleri arasında yer alan section.SectionInformation.IsProtected özelliği bu noktada bizim için önemli. bu özellik bu alanın şifreli olup olmadığı bilgisini bize veriyor. Bunu şifreleme yaparken alanı tekrardan şifrelemeye çalışmamak için, veya açma yaparkende şifresiz bir alanı açmaya çalışmamak için kullanabiliriz.
Gerekli kontrolleri yaptıktan sonra artık alanı şifreleme veya açma işlemini yapabiliriz :
Şifrelemek için :
Açmak için :
Son olarak değişikliğin dosyaya yansıtılması için :
Böylece işlem tamamlanır. Bu işleri daha kolay yapabilmek için 2 ayrı metod haline getirirsek :
{
public static void ProtectSection(string sectionName, string provider)
{
Configuration config = WebConfigurationManager. OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
ConfigurationSection section = config.GetSection(sectionName);
if (section != null && !section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection(provider);
config.Save();
}
}
public static void UnProtectSection(string sectionName)
{
Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
ConfigurationSection section = config.GetSection(sectionName);
if (section != null && section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
config.Save();
}
}
}
Kullanırken ise :
Şifrelemek için :
Açmak için :
şeklinde olabilir.
ASP.NET AJAX 4.0 Preview 5
ASP.NET AJAX kütüphanesinin son versiyonu olan 4.0′ın 5 numaralı ön sürümü görücüye çıktı.
ASP.NET AJAX kütüphanesinin özellikleri şöyle:
- istemci şablonları ile veri tabanı verilerini tarayıcıda formatlamak
- DataView kontrolü gibi istemci kontrolleri
- İstemci DataContext bileşeni, Değişimin izlemesini ve kimlik yönetimini destekler
- ADO.NET Veri Servisleri desteği
- WCF ve ASMX Web servis desteği
- JSONP desteği
- Düz JavaScript nesneleri için Gözlemlenebilir desen
- Live Bindings
- Command Bubbling
- Karmaşık bağlantılar ve varlıklar arasındaki ilişkiyi birden fazla varlık setleri veya tablolardan yönetmek için destek
Şu adresten indirebilirsiniz.
ASP.Net Çıktı Ön Belleği (Output Cache)
ASP.Net’in Gizli Gücü
Web sitelerimizin herkese açık ara yüzleri genellikle belli aralıklarda güncellenir. Ancak ASP.Net bu sayfaları her istek olduğunda tekrardan oluşturur ve istemciye gönderir. Çok fazla kullanıcının izlediği sayfalarda bu bizim sayfalarımızın ve web sitelerimizin yavaş çalışmasına yol açacak şekilde yavaşlamaya başlar. Esasında bu problemin kolay bir çözüm yolu vardır. Oda Çıktı ön bellek’idir.
ASP.Net çıktı ön belleği şu şekilde çalışır. Sayfa ilk istendiğinde sayfa ASP.Net tarafında çalıştırılır. Ve sonuç html çıktısı özel bir alanda saklanır. Aynı sayfa tekrar istenecek olursa, hiç sayfa tekrardan çalıştırılmadan, özel alandaki bilgi istemciye gönderilerek çok daha hızlı bir şekilde işlem biter. Sistemin yorulması engellenerek, daha performanslı bir şekilde çalışma sağlanmış olur.
Şimdi bir sayfada nasıl çıktı ön belleği kullanılabileceğini görelim.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>Caching</title> </head> <body> <form id="form1" runat="server"> <%= DateTime.Now.ToString() %> </html> </title> </html>
Şeklinde hazırladığımız basit sayfamızı Çıktı ön belleği özelliğini aktif edecek şekilde şöyle ayarlayabiliriz.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ OutputCache Duration="600" VaryByParam="none" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>Caching</title> </head> <body> <form id="form1" runat="server"> <%= DateTime.Now.ToString() %> </html> </title> </html>
Burada duration ön bellek süresini ifade eder. Saniye cinsinden girilir.
VaryByParam =none ise ön bellek için herhangi bir parametrenin kullanılmayacağını ve sayfanın herkese aynı şekilde gösterileceğini ifade etmektedir.
Böylece tek satırlık bir işlem sonucunda sayfamız 10 dakika süreliğine ön belleğe alınmış olacaktır. Bu tek başına yeterli gelmeyebilir. Mesela her bir tarayıcı için ayrı ayrı ön bellekleme yapılabilir. Şimdi ön bellek ayarlarını nasıl yapabileceğimize bakalım.
VaryByParam kullanımı :
Bu ayara yazılacak olan parametreler QueryString, Form, Cookie’ler veya ServerVariables içerisinde aranarak bulunmaya çalışılır. Eğer none yazacak olursak, herhangi bir şey seçmemiş oluruz.
Örneğin:
VaryByParam="txtName;lstSelection"
txtName ve lstSection’ın her bir farklı değerleri için bir ön bellek oluşturulacaktır.
Bu İçerik Yönetim Sistemleri için uygun bir yöntem olabilir. Mesela adreste sayfayı gösteren bir parametre kullanılıyor ise:
http://www.deneme.com/page.aspx?id=5
bu sayfalar için VaryByParam=”id” tanımlamasını yapmak her bir id için ayrı bir ön bellek yapılması sağlanabilir.
VaryByControl kullanımı:
Sayfamızın içinde yer alan kontrollere göre bir ön bellek yapılsın istiyorsak bu özelliği kullanabiliriz.
Controls.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Controls.aspx.cs" Inherits="OutputCacheDemo.Controls" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:DropDownList ID="ddl1" runat="server" AutoPostBack="true" onselectedindexchanged="ddl1_SelectedIndexChanged"> <asp:ListItem>1. Seçenek</asp:ListItem> <asp:ListItem>2. Seçenek</asp:ListItem> <asp:ListItem>3. Seçenek</asp:ListItem> <asp:ListItem>4. Seçenek</asp:ListItem> <asp:ListItem>5. Seçenek</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="ddl2" runat="server"> </asp:DropDownList> </div> </html> </title> </html>
Controls.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace OutputCacheDemo
{
public partial class Controls : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddl2DataBind();
}
}
protected void ddl1_SelectedIndexChanged(object sender, EventArgs e)
{
ddl2DataBind();
}
private void ddl2DataBind()
{
ddl2.Items.Clear();
for (int i = 1; i <= 5; i++)
{
ddl2.Items.Add(string.Format("{0}. seçeneğin {1}. alt seçeneği", ddl1.SelectedIndex + 1, i));
}
}
}
}
Bu sayfada çıktı ön belleğini şu şekilde yazacak olursak, sayfa ddl1 kontrolünün her farklı değeri için ön belleklenecektir.
<%@ OutputCache Duration="600" VaryByParam="none" VaryByControl="ddl1" %>
VaryByHeader Kullanımı:
Http isteğinde gelen bilgilere göre sayfanızın ön belleklenmesini istiyorsanız bu özelliği kullanabilirsiniz. Mesela tarayıcıya göre ön bellek oluşturmak için:
<%@ OutputCache Duration="600" VaryByParam="none" VaryByHeader="User-Agent" %>
veya tarayıcıda tanımlı dillere göre ön bellek oluşturmak için
<%@ OutputCache Duration="600" VaryByParam="none" VaryByHeader="Accept-Language" %>
yazmak gerekir.
VaryByCustom Kullanımı:
Ön bellekleme için kendimize göre değerler belirleyebilmemiz mümkün. Bunu diğer yöntemlerden sonuç alamadığımızda kullanabiliriz. Bu değerlere göre ASP.Net ön bellek oluşturabilir. Bu değeri oluşturabilmek için global.asax içerisine aşağıdaki gibi bir kod yazmamız yeterli olacaktır.
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (string.Compare(custom, "browser", true) == 0)
{
return string.Format("{0} {1}", context.Request.Browser.Browser, context.Request.Browser.Version);
}
return base.GetVaryByCustomString(context, custom);
}
Kullanımı ise
<%@ OutputCache Duration="600" VaryByParam="none" VaryByCustom="Browser" %>
Şeklinde olacaktır.
Şimdiye kadar hep sayfalar üzerinde anlattığımız bu detaylar, Kullanıcı tanımlı kontrollerde de(User Controls) kullanılabilmektedir. Hatta bu yöntem sayfanın parçalı olarak ön belleklenmesinide sağlayabilir.
Örnek olarak aşağıdaki kontrolleri ve sayfaları inceleyelim:
UC1.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UC1.ascx.cs" Inherits="OutputCacheDemo.UC1" %> <%@ OutputCache Duration="600" VaryByParam="none" %> <%= DateTime.Now.ToString() %>
UC2.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UC2.ascx.cs" Inherits="OutputCacheDemo.UC2" %> <%@ OutputCache Duration="300" VaryByParam="none" %> <%= DateTime.Now.ToString() %>
Bu 2 kontrolü sayfa içerisinde şöyle kullanabiliriz:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Controls2.aspx.cs" Inherits="OutputCacheDemo.Controls2" %> <%@ Register Src="UC1.ascx" TagName="UC1" TagPrefix="uc1" %> <%@ Register Src="UC2.ascx" TagName="UC2" TagPrefix="uc2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <uc1:UC1 ID="UC11" runat="server" /> <br /> <uc2:UC2 ID="UC21" runat="server" /> </html> </title> </html>
Bu sayfanın ekran görüntüsü:

5 dakika sonra alınan ekran görüntüsü:

Şeklinde olacaktır. Böylelikle sayfanın farklı bölgeleri farklı ön bellek sürelerine sahip olabilecektir.
Bazı Kaynak Adresleri
http://www.csharpnedir.com
http://www.msakademik.net
Referans Sitesi:
http://www.devguru.com
Code Project:
http://www.codeproject.com
MSDN:
http://www.msdn.com
Asp.net Official Site:
http://www.asp.net
Silverlight Official Site:
http://silverlight.net/
Codeplex: (Open Source Proje Birliği)
http://www.codeplex.com/
Sourceforge : (Open Source Proje Birliği)
http://www.sf.net
Notepad++ : (Çok iyi bir notepad uygulaması)
http://notepad-plus.sourceforge.net/uk/site.htm
Urlrewriting.Net ‘i ayarlamak
Urlrewriting.Net, web sayfalarımızda url adreslerimizi değiştirmemizi, daha kullanıcı dostu yapmamızı sağlayan bir komponenttir. Bu komponent’i http://www.urlrewriting.net adresinden indirebiliyoruz.
Bende size komponent’in nasıl projemize dahil edebileceğimizi anlatmak istiyorum.
Öncelikle indirdiğimiz dosyanın içindeki ddl dosyasını projemizin referanslarına ekliyoruz. Sonra web.config içerisinde aşağıdaki değişiklikleri yapmamız gerekiyor.
1. configSections altına aşağıdaki satırı ekleyelim:
<section name="urlrewritingnet" restartOnExternalChanges="true" requirePermission ="false" type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter" />
2. system.web altındaki httpModules altına aşağıdaki satırı ekleyelim:
<add name="UrlRewriteModule"
type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
3. </configuration> satırından önce aşağıdaki satırları ekleyelim.
<urlrewritingnet
rewriteOnlyVirtualUrls="true"
contextItemsPrefix="QueryString"
defaultPage = "default.aspx"
defaultProvider="RegEx"
xmlns="http://www.urlrewriting.net/schemas/config/2006/07" >
<rewrites>
<!—kuralları buraya yazacağız. -->
</rewrites>
</urlrewritingnet>
4. yönlendirmek istediğimiz her bir sayfa için bir kural oluşturmamız gerekiyor. Veya regex kullanarak birden fazla sayfa içinde kurallar oluşturabiliriz. Bu kurallar 3. adımda eklediğimiz urlrewritingnet başlığı altındaki rewrites başlığı altına eklememiz gerekmekte. Örnek olarak oluşturduğum bir kural aşağıda gösterilmiştir.
<add name="Rewrite01" virtualUrl="^~/([a-z]{2}-[a-z]{2})/(.*)_([0-9]+).aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/PageSystem.aspx?lang=$1&pid=$3"
ignoreCase="true" />
bu kural ile http://alper.konuralp.gen.tr/tr-TR/GirisSayfasi_12.aspx sayfasını açmaya çalıştığınızda arkada http://alper.konuralp.gen.tr/PageSystem.aspx?lang=tr-TR&pid=12 sayfasını çağırmış olmakta.
İyi Çalışmalar
