Web projemizi geliştirirken local sunucumuzda “http://musterisitesi/” olarak tanımlamış olalım ve müşteri yayın ortamı örneğin “http://www.musterisitesi.com/site2010/v2/” olsun. Sayfalarımızda ve özellikle CSS dosyalarında birçok kez kaynak dosya yolu belirtmişizdir.
Örneğin
1 | body { background-image : url (/images/bg.jpg); } |
Bu durumda sitemizi müşteri ortamına attığımızda “bg.jpg” dosyası “http://www.musterisitesi.com/images/” içinde aranacaktır. Fakat gerçek yol “http://www.musterisitesi.com/site2010/v2/images/” dir. Böylece local ortamımızda kullandığımız yollar yüzünden yayındaki sitenin birçok sayfasında kaynak dosya yolu problemleri çıktığını düşünelim.
Local’deki görüntü

Müşteri ortamındaki görüntü

Bu problemi nasıl aşarız@f0 Bu yazıda çözüm için uygulanabilecek yöntemlerden bir tanesine değineceğiz.
İzleyebileceğimiz yöntem, sitenin kök yolunu parametrik olarak tanımlamak ve her zaman kaynak dosya yollarımızın başına eklemektir. Sitenin kök yolunu
Web.config dosyasında tanımlayacağımız bir anahtar ile yöneteceğiz.
local web.config
2 | < add key = "WebSiteRoot" value = "" /> |
müşteri web.config
2 | < add key = "WebSiteRoot" value = "/site2010/v2" /> |
Bu yöntemi iki koldan uygularız:
1.kol; sayfalarımızda kullandığımız “<img src=”, “<a href=”, “<link href=”, “<script src=” vb. gibi kaynak yolu belirtmemiz gereken durumlar için kod tarafında “public” değişken oluşturmak ve bunu html source tarafında <%= %> belirtimi ile kullanmak. Örneğin:
Default.aspx
04 | < asp:Literal ID = "ltHEAD" runat = "server" ></ asp:Literal > |
07 | < form id = "form1" runat = "server" > |
09 | < img src="<%= WebSiteRoot %>/images/publish_f2.png" alt="" />Dinamik Kaynaklar |
Default.aspx.cs
01 | public string WebSiteRoot = ConfigurationSettings.AppSettings[ "WebSiteRoot" ].ToString(); |
03 | protected void Page_Load( object sender, EventArgs e) |
11 | private void HeaderInit() |
14 | ltHEAD.Text += "<link rel=\"Stylesheet\" href=\"" + WebSiteRoot + "/css/style.css\" />" ; |
2.kol ise “.js”, “.css” gibi harici kaynak dosyalarımızın içinde örneğin imaj kullanacaksak generic handler yapısı kullanmak.
style.css
3 | background-color : #FFFFFF ; |
4 | background-image : url (images.ashx?src=/images/bg.jpg); |
5 | background-repeat : repeat-x ; |
CSS ve JavaScript içinde, html source’da kullandığımız gibi <%= WebSiteRoot %> ifadesi kullanamayız. Fakat bir sayfayı parametre göndererek kullanabiliriz. İşte bu noktada Generic Handler’ları iyi bir enstruman olarak kullanabiliriz.
Generic handler’ımız aldığı “src” parametresi ile WebSiteRoot parametresini kendi içinde birleştirir ve src ile verdiğimiz dosyayı gerçek yolundan alarak ekrana basar.
images.ashx
02 | [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] |
03 | public class images : IHttpHandler |
06 | public void ProcessRequest(HttpContext context) |
08 | string imgSrc = context.Request.QueryString[ "src" ].ToString(); |
09 | string path = context.Server.MapPath(ConfigKeys.WebSiteRoot + imgSrc); |
10 | string contentType = "image/jpeg" ; |
11 | FileInfo file = new FileInfo(path); |
12 | switch (file.Extension.ToLower()) |
14 | case "jpg" : contentType = "image/jpeg" ; break ; |
15 | case "png" : contentType = "image/png" ; break ; |
16 | case "gif" : contentType = "image/gif" ; break ; |
18 | context.Response.AddHeader( "Content-Length" , file.Length.ToString()); |
19 | context.Response.ContentType = contentType; |
20 | context.Response.WriteFile(file.FullName); |
21 | context.Response.End(); |
24 | public bool IsReusable |
İşin canalıcı noktası web.config’de bir anahtar tanımlamak, bu anahtarı kullanarak kaynak dosyaları Generic Handler ile yönetmek.
Kolay gelsin.
Hiç yorum yok:
Yorum Gönder