ASP.NET’te Page_Load Olayının Master Page’deki Page_Load Olayından Önce Tetiklenmesi

Okuma Süresi: 1 dakika

ASP.NET’te bazı durumlarda sayfa yüklemeden önce bazı işlemlerin yapılması gerekebilir. Örneğin kullanıcı doğrulaması gibi.

Bu gibi durumlarda hem sayfalarda hem de Master Page’lerde Page_Load olayı kullanılır. Ancak bu olayda sayfanın içeriği oluşturulmaktadır. Sayfanın içeriği oluşturulmadan önce bu kontrolleri yapabilmemiz için Page_Init ve Page_PreRender olayları kullanılır.

Master Page dosyalarımızda Page_Init, normal sayfalarımızda ise Page_PreRender olayı kullanılır. Örnek kullanımları aşağıdaki gibidir:

Master Page


protected void Page_Init(object sender, EventArgs e) { /*Olay gövdesi */ }

 

Sayfalar


protected void Page_PreRender(object sender, EventArgs e) { /*Olay gövdesi*/ }

ASP.NET 4’ün IIS’e Register Edilmesi

Okuma Süresi: 1 dakika

Web sunucuya yüklemiş olduğunuz bir ASP.NET 4.0 uygulamasını çalıştırdığımızda HTTP Error 500.21 – Internal Server Error – Handler “PageHandlerFactory-Integrated” has a bad module “ManagedPipelineHandler” in its module list” şeklinde bir hata alırsanız ASP.NET, IIS’e register edilmemiştir.

HTTP Error 500.21 - Internal Server Error

Bu sorunu düzeltmek için Komut İstemi’nden (Command Prompt) aşağıdaki komutu çalıştırmanız yeterlidir.

%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

Bu komutu çalıştırdığınız zaman ASP.NET başarıyla IIS’e register edilmiş olacaktır.

Web Servislerinde Session Kullanımı

Okuma Süresi: 1 dakika

Bir ASP.NET uygulamasında web servisiniz içerisinden Session’a erişmek istediğiniz zaman “Object reference not set to an instance of an object” hatasını alacaksınızdır.

Örnek olarak aşağıdaki gibi bir servis metodumuz olsun.

        [WebMethod]
        public string SayHello()
        {
            if(HttpContext.Current.Session["message"] != null)
               return HttpContext.Current.Session["message"];
            return "";
        }

Uygulamamızın herhangi bir yerinde message isminde bir Session’ın oluşturulduğunu varsayalım. null kontrolü yapmamıza rağmen if bloğunun başında “Object reference not set to an instance of an object” hatasını fırlatacaktır. HttpContext null olmamasına rağmen HttpContext’in Session özelliği null olarak gelmektedir.

Sorunu çözebilmek için WebMethod niteliğimizin (attribute) EnableSession özelliğini true olarak ayarlamamız gerekmektedir.

        [WebMethod(EnableSession = true)]
        public string SayHello()
        {
            if(HttpContext.Current.Session["message"] != null)
               return HttpContext.Current.Session["message"];
            return "";
        }

Kodumuzu bu şekilde düzenleyip çalıştırdığımızda sorunsuz bir şekilde çalışacaktır.

SignalR ile Gerçek Zamanlı Web Uygulamaları

Okuma Süresi: 1 dakika

SignalR, WebSocket protokolünü kullanarak gerçek zamanlı uygulamalar geliştirebileceğimiz bir kütüphanedir. Bugün basit bir sohbet uygulaması yapacağız.

Şimdi bir tane ASP.NET projesi açıp Package Manager Console’dan aşağıdaki komutu girerek SignalR için gerekli dosyaları projemize ekleyelim. (Package Manager Console’a ulaşmak için View->Other Windows -> Package Manager Console menüsünü kullanabilirsiniz.)

Install-Package Microsoft.AspNet.SignalR

Projemize bir sınıf ekleyelim ve aşağıdaki kodları yazalım.

public class ChatHub : Hub
    {
        public void SendMessage(string message)
        {
            Clients.All.sendMessage(message);
        }
    }

Burada yazdığımız kodda sisteme bağlı tüm kullanıcılara yazılan mesajı iletiyoruz. Sunucu tarafındaki kodlama bu kadardır. Şimdi istemci tarafında kodlamaya başlıyoruz.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SignalRExample.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="Scripts/jquery-1.6.4.min.js"></script>
    <script type="text/javascript" src="Scripts/jquery.signalR-2.0.2.min.js"></script>
    <script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>
    <script type="text/ecmascript">
        $(function () {
            var chatHub = $.connection.chatHub;

            chatHub.client.receiveMessage = function (message) {
                $(".message").append(message + "<br>");
            };

            function SendMessage() {
                var message = $(".messageText").val();

                if (message != "" && message != null) {
                    chatHub.server.sendMessage(message);
                }
            }

            $(".send").click(function (e) {
                SendMessage();
            });

            $.connection.hub.start();
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <input type="text" class="messageText" /><input type="button" class="send" value="Gönder" />
        <div class="message">
        </div>
    </form>
</body>
</html>

Javascript’te yazdığımız kodları tek tek açıklyalım:

  • var chatHub = $.connection.chatHub; satırı ile Hub sınımıfımızın JavaScript kısmında erişebilmek için yazdık. Sınıfımızın ismi Javascript tarafında camel case olarak yazılmıştır. Eğer pascal case veya başka bir adlandırma istersen sınıfımıza [HubName(“ChatHub”)] şeklinde yazabilirsiniz.
  • chatHub.client.receiveMessage satırı ile sunucu tarafında hub tetiklendiğinde çalışacak olan metotdur. Biz burada tetiklendiğinde div içerisine mesajı yazmaktayız.
  • chatHub.server.sendMessage(message); satırı ile sunucu tarafında bulunan SendMessage metodunu çağırıyoruz.
  • $.connection.hub.start(); satırı ile sayfamız yüklendiğinde hub’ın çalışmasını sağlıyoruz.

Kodumuzu derleyip iki farklı tarayıcı ekranında test edince aşağıdaki gibi bir ekran görüntüsü çıkmaktadır:

SignalR ile gerçek zamanlı web uygulamaları

Örnek projenin kodlarını indirmek için tıklayınız.