Windows Phone’da Bir DependencyProperty Değiştiğinde Haberdar Olma

by mbaykal 7. Ocak 2012 16:18

WPF’de bir DependencyProperty’nin PropertyMetadata’sı üzerinde işlem yapmak istediğimizde DependencyPropertyDescriptor sınıfı hayatımızı kurtarırdı. Ancak bu sınıf Windows Phone’da yok. Bu çoğu zaman bunu hissetmezsiniz. Ancak ya bir DependencyProperty değiştiğinde haberdar olmanız gerekiyorsa?

Bunu bir hack yardımı ile yapabilirsiniz.

public static void Register(DependencyObject target, string propertyPath, DependencyPropertyChangedEventHandler dependencyPropertyChanged)
{
    Binding binding = new Binding(propertyPath) { Source = target };

    var property = DependencyProperty.RegisterAttached("_" + Guid.NewGuid().ToString("N"), typeof(object), typeof(DependencyObject),
        new PropertyMetadata
        (
            (o, e) =>
            {
                o.Dispatcher.BeginInvoke(() => dependencyPropertyChanged.Invoke(o, e));
            }
        )
    );

    BindingOperations.SetBinding(target, property, binding);
}

Örnek projeyi ve kodlara buradan ulaşabilirsiniz.

Bu yazı çok kısa oldu sanırım, daha sonra görüşmek üzere…

Tags:

C# | Windows Phone

Windows Phone 7.5 ile AWS Kullanmak - Bölüm 3

by mbaykal 20. Kasım 2011 01:45

Henüz okumadıysanız makalemin ilk kısmına buradan, ikinci kısmına ise buradan ulaşabilirsiniz.

PutAttributes

SimpleDb’ye Insert ve Update işlemleri PutAttributes aksiyonu ile yapılıyor. Bu işlem ile daha detaylı bilgiyi dokümantasyondan okuyabilirsiniz.

var data = new Dictionary<string, string>()
{
    { "Action", "PutAttributes" }, 
    { "DomainName", "domain_ismi" },
    { "ItemName", "Deneme Kaydi" },
    { "Attribute.1.Name", "1. atrribute" },
    { "Attribute.1.Value", "1. değer" },
};

Haplois.Cloud.AWS.Common.REST.Query(data, (o) =>
{
    var result = new Haplois.Cloud.AWS.ResponseBase(XDocument.Parse(o));         
});

Yukarıdakine benzer bir kod ile Insert işlemi yapabiliriz. Yukarıdaki kod, “domain_ismi” domaininde ismi “Deneme Kaydı” olan bir kayıt oluşturur (ya da varsa onu seçer) ardından ismi “1. attribute” olan bir nitelik yaratır ve ona “1. değer” değerini atar.

PutAttributes aksiyonu ile eklenecek ya da güncellenecek nitelikleri göndermek için “Attribute.N.Name”, “Attribute.N.Value” ve “Attribute.N.Replace” parametreleri kullanılır. Burada “N” herhangi bir doğal sayı olabilir.

  • Attribute.N.Name: Eklenecek ya da güncellenecek olan niteliğin ismi
  • Attribute.N.Value: Eklenecek ya da güncellenecek olan niteliğin değeri
  • Attribute.N.Replace: “false” olarak verildiğinde niteliği aynısı olsa bile yeniden ekler. “true” olarak verildiğinde ise aynısı varsa günceller, yoksa ekler. Varsayılan değeri: “false”

Insert ve Update işlemlerini kolaylaştırması için yazdığım metodları ekteki kodlardan inceleyebilirisiniz.

DeleteAttributes

Delete işlemlerini bu aksiyon ile yapılıyor. Bu işlem hakkında daha detaylı bilgiyi dokümantasyondan bulabilirsiniz.

var data = new Dictionary<string, string>()
{
    { "Action", "DeleteAtributes" }, 
    { "DomainName", "domain_ismi" },
    { "ItemName", "Deneme Kaydi" },
    { "Expected.1.Name", "1. atrribute" },
    { "Expected.1.Value", "1. değer" },
};

Haplois.Cloud.AWS.Common.REST.Query(data, (o) =>
{
    var result = new Haplois.Cloud.AWS.ResponseBase(XDocument.Parse(o));

    MessageBox.Show(result.BoxUsage.ToString());
});

Bu aksiyon ismi verilen domain’de silme işlemi yapar.  Eğer Expected.N.Name ve Expected.N.Value ikilisi ile belirli nitelikler verilmişse bu nitelikleri sağlayan öğeler silinir. Silme işlemi sırasında Parameter.N.Name ile parametre ismi verilmişse yalnızca isimleri verilen parametreler silinir. Eğer parametrenin çoklu değeri varsa Parameter.N.Value ile istenilen değeri de verilerek yalnızca istenilen parametrenin silinmesi sağlanabilir.

Eğer parametre ismi verilmemişse öğe ve tüm parametreleri silinir.

Update ve Delete işlemlerinde şartları sağlayan bir öğe bulunamazsa hata oluşmaz ve işlem başarılı mesajı döner.

Delete işlemi için yazdığım yardımcı metodu da  örnek kodlar içerisinde bulabilirsiniz.

SimpleDb ile ilgili yazacaklarım bu kadar. Daha sonra Amazon Simple Storage Service ile ilgili olarak da bir şeyler yazacağım. Ancak lütfen unutmayın, bu yazılarda verdiğim kodlar sadece örnek amaçlı, servilerin tüm özelliklerini içermiyor ya da en iyi çözümü sunmuyor olabilirler.

Bu yazının örnek kodlarını buradan indirebilirsiniz.

Tags: , , ,

Cloud | Windows Phone

Windows Phone 7.5 ile AWS Kullanmak - Bölüm 2

by mbaykal 18. Kasım 2011 02:27

Bir önceki makalemi okumadıysanız öncelikle onu okumanızı tavsiye ederim. Önceki makalemde bıraktığım yerden devam ediyorum.

AWS’ye REST İsteklerini Gönderme

İsteklerimizi imzalamak için gerekli kodlar artık elimizde olduğuna göre AWS’yi sorgulamaya başlayabiliriz. AWS’ye yapacağımız isteklerde parametrelerimiz “application/x-www-form-urlencoded” olarak gönderilmeli. 

Bunu sağlamak için aşağıdaki fonksiyonu yazıyoruz bu fonksiyonu Amazonun SDK’sından aldım.

internal static string GetParametersAsString(IDictionary<string, string> parameters)
{
    StringBuilder data = new StringBuilder(512);
    foreach (string key in (IEnumerable)parameters.Keys)
    {
        string value = parameters[key];
        if (value != null)
        {
            data.Append(key);
            data.Append('=');
            data.Append(UrlEncode(value, false));
            data.Append('&');
        }
    }
    string result = data.ToString();
    return result.Remove(result.Length - 1);
}

Bu fonksiyonu yazdıktan sonra basit bir HttpWebRequest ile sunucuyu sorgulayabiliriz artık. Bunun için aşağıdaki kodu kullanacağız.

public static void Query(IDictionary<string, string> values, Action callback)
{
    var serviceUrl = Configuration.SimpleDbServiceUrl;

    ConfigureParameters(values);
    var queryString = Helpers.GetParametersAsString(values);
    var queryData = Encoding.UTF8.GetBytes(queryString);
    var request = HttpWebRequest.CreateHttp(serviceUrl);

    request.Method = "POST";
    request.ContentType = Helpers.UrlEncodedContent;

    var asyncResult = request.BeginGetRequestStream((getRequestStreamAsyncResult) =>
    {
        using (var stream = request.EndGetRequestStream(getRequestStreamAsyncResult))
        {
            stream.Write(queryData, 0, queryData.Length);
        }

        request.BeginGetResponse((getResponseAsyncResult) =>
        {

            var response = request.EndGetResponse(getResponseAsyncResult);

            using (var stream = response.GetResponseStream())
            using (var streamReader = new StreamReader(stream))
            {
                callback(streamReader.ReadToEnd());
            }

        }, null);
    }, null);
}

Yukarıda yazdığımız bu fonksiyon AWS’ye istediğimiz sorguyu gönderecek ve eğer bir hata oluşmazsa bir XML elde edecektir. Biz’de bu XML’i işleyerek istediğmiz veriyi alacağız.

SimpleDB Temelleri

SimpleDB ilişkisel olmayan basit bir veritabanı sistemidir. Veriler domain adı verilen yapılarda saklanırlar. (MSSQL’deki Table'lara eşdeğer – neredeyse)

Örneğin buradan sonrasına devam edebilmek için, lütfen birkaç tane domain oluşturun.

Şimdi bazı SimpleDB aksiyonlarını inceleyelim.

ListDomains

Bu operasyon ile ilgili daha detaylı bilgiyi Amazon’un dokümantasyonundan okuyabilirsiniz.

Haplois.Cloud.AWS.Common.REST.Query(
    new Dictionary<string, string>()
    {
        {"Action", "ListDomains"}
    }, (sonuc) =>
    {
        // sonuç geldi    
    }
);

Yukarıdaki gibi bir kod ile bu aksiyonu çağırabilirsiniz.  Bu asenkron çalışan bir işlen olduğundan sunucu yanıt verdiğinde ilki kod parçacığı çalışacaktır.

Query metoduna biraz dikkat ederseniz parametre olarak aldığı “callback” isimli delegate’i işlem bitince çağırıyor. Ancak bu çağrı UIThread’de olmadığından doğrudan UIThread’e ulaşmaya çalışırsanız “UnauthorizedAccessException” istisnası ile karşılaşırsınız. Bu hata ile karşılaşmamak için UIThread’a Dispatcher aracılığı ile erişmelisiniz. Bunun bir örneğini ekleyeceğim kodda görebilirisiniz.

ListDomains aksiyonunun cevabı aşağıdaki gibi birşey olmalı:

<?xml version="1.0"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
  <ListDomainsResult>
    <DomainName>domain1</DomainName>
    <DomainName>domain2</DomainName>
    <DomainName>domain3</DomainName>
  </ListDomainsResult>
  <ResponseMetadata>
    <RequestId>5a3e68aa-0ad4-6b6d-1f86-c93c9f1b142b</RequestId>
    <BoxUsage>0.0000071759</BoxUsage>
  </ResponseMetadata>
</ListDomainsResponse>

Bu cevabın “ResponseMetadata” kısmı tüm SimpleDb cevapları için ortaktır.

Her defasında bu işlemlerle uğraşmamak için bu cevapları bizim için işleyecek olan Base ve ResponseBase isimli iki sınıf yazdım. Bu sınıfların kodları oldukça basit, isterseniz örnek kodlar içerisinde inceleyebilirisiniz.

Select

Bu operasyon ile ilgili daha detaylı bilgiyi Amazon’un dokümantasyonundan okuyabilirsiniz.

Haplois.Cloud.AWS.Common.REST.Query(
    new Dictionary<string, string> 
    { 
        { "Action", "Select" }, 
        { "SelectExpression", "SELECT * FROM domain1" },
        { "ConsistentRead", "true" },
    },
    (o) =>
    {
        Dispatcher.BeginInvoke(() =>
        {
            textBlock1.Text = o;
        });
    }
);

Bu aksiyonu yukarıdaki gibi bir kodla çağırdığınızda aşağıdaki gibi bir yanıt alırsınız:

<?xml version="1.0"?>
<SelectResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
  <SelectResult>
    <Item>
      <Name>rowName1</Name>
      <Attribute>
        <Name>attribute1</Name>
        <Value>100300</Value>
      </Attribute>
      <Attribute>
        <Name>attribute2</Name>
        <Value>3</Value>
      </Attribute>
    </Item>
    <Item>
      <Name>rowName2</Name>
      <Attribute>
        <Name>attribute1</Name>
        <Value>100300</Value>
      </Attribute>
      <Attribute>
        <Name>attribute3</Name>
        <Value>4</Value>
      </Attribute>
    </Item>
  </SelectResult>
  <ResponseMetadata>
    <RequestId>8f47891c-2a21-e0d6-7e9f-0b5f727d1d29</RequestId>
    <BoxUsage>0.0000228616</BoxUsage>
  </ResponseMetadata>
</SelectResponse>

Bu XML’i işlememize yardımcı olması için bir kaç sınıf yazdım. Bunlardan ilki SelectResponse sınıfı; bu sınıf  XML’i işliyor ve gelen öğeleri saklıyor. İkincisi olan DataRow sınıfı ise XML’deki bir Item’ı ve onun Attribute’larını temsil ediyor. Bu sınıfın kodlarını incelemek isterseniz örnek kodlar içerisinde bu sınıflar da mevcut.

Son olarak SimpleDbClient isimli bir sınıf daha yazdım. Bu sınıf SimpleDb üzerinde yapabilceğimiz aksiyonları içerecek. Şuan sadece Select aksiyonunu içeriyor.

Bu günlük de bu kadar, devamı yarın. Yarın ki yazımda da SimpleDb üzerinde Update ve Insert işlemlerini yazacağım.

Bu makale için örnek kodları buradan indirebilirsiniz.

Tags: , , ,

C# | Cloud | Windows Phone

Windows Phone 7.5 ile AWS Kullanmak - Bölüm 1

by mbaykal 18. Kasım 2011 00:44

Her ne kadar Windows Phone ile Azure kullanma taraftarı da olsam; bazen zaruretten başka çözümleri de kullanmak zorunda kalabilirsiniz. Örneğin bir iOS ya da Android uygulamasının Windows Phone sürümünü geliştiriyorsanız ve bu uygulamalar zaten AWS kullanıyorsa, işte o aşamada Azure kullanma şansınız pek kalmıyor.

Amazon; Android ve iOS için bir SDK yayınlamış durumda. Aslına bakarsanız Windows ve .Net için de bir SDK’sı var. Bu SDK’yı indirirseniz bir Windows Phone uygulamasına referans edemeyeceğinizi fark edeceksiniz.

Biraz daha inatçıysanız belki kaynak kodunu indirip, Windows Phone için derlemeye çalışacaksınız ama SDK’nın Hastable, ArrayList, SecureString ve HashAlgoritm gibi Windows Phone tarafında desteklenmeyen bir sürü nesne kullandığını fark edeceksiniz ve pes edeceksiniz.

Hayır! Tabii ki de pes etmeyip, kendi SDK’msınızı yazacaksınız.

Bir kaç parça olarak düşündüğüm bu yazının ilk kısmında Amazon SimpleDB’yi anlatacağım.

Amazon SimpleDB Nedir?

Amazon SimpleDB is a highly available, flexible, and scalable non-relational data store that offloads the work of database administration. Developers simply store and query data items via web services requests, and Amazon SimpleDB does the rest.

Unbound by the strict requirements of a relational database, Amazon SimpleDB is optimized to provide high availability, flexibility, and ease of scalability with little or no administrative burden. Behind the scenes, Amazon SimpleDB creates and manages multiple geographically distributed replicas of your data automatically to enable high availability and data durability. The service charges you only for the resources actually consumed in storing your data and serving your requests. You can change your data model on the fly, and data is automatically indexed for you. With Amazon SimpleDB, you can focus on application development without worrying about infrastructure provisioning, high availability, software maintenance, schema and index management, or performance tuning.

Yukarıda ki tanımı Amazon’un kendi sitesinden arakladım ve hayır Türkçe’ye çevirmeyeceğim ;)

Biraz Daha Hazırlık

SimpleDB, belli bir seviyeye kadar ücretsiz kullanım sağlıyor. Eğer bir AWS hesabınız yoksa ücretsiz olarak bir tane oluşturabilir ve SimpleDB kullanmaya başlayabilirsiniz.

Veritabanına bağlanabilmek için AWS bize iki anahtar veriyor. Bunlar:

  • Access Key ID: 20 karakterlik sayı ve rakamlardan bir dizi
  • Secret Key ID: 40 karakterlik sayı, rakam ve sembollerden oluşan bir dizi. Bu bilginin gizli kalması gerektiğini, sizden ve Amazon’dan başka hiç kimsenin bilmemesi gerektiğini unutmayın!

Hazırlığın Son Kısmı

Kodlama süresince kolaylık sağlaması için yukarıdaki bilgileri saklayacağım bir sınıf tanımlayacağım; ama siz bu bilgileri daha güvenli bir şekilde saklamalısınız.

namespace Haplois.Cloud.AWS.Common
{
    public class Configuration
    {
        public const string Key = "BFSCUDCFRFDGCFDEUFDV";
        public const string SecretKey = "***secret key***";

        public const string ServiceVersion = "2009-04-15";
        public const string SimpleDbServiceUrl = "https://sdb.amazonaws.com";
        public const string SignatureVersion = "2";
        public const string SignatureMethod = "HmacSHA256";
    }
}

Yukarıdaki yukarıda size henüz bahsetmediğim bir kaç tanımlama var bunlar;

  • ServiceVersion: Amazon AWS servislerini versiyonlayarak geriye uyum sağlıyor. Bizim bu örneklerde kullanacağımız versiyonu sakladığımız sabitimiz.
  • SignatureVersion: Servise göndereceğimiz istekleri imzalayacağımız algoritmanın versiyonunu burada saklıyoruz.
  • SignatureMethod: Kullanacağımız imzalama metodu.

İstekleri İmzalama

Amazon Web Servislerini sorgulayabilmek için kimliğimizi doğrulamamız gerekli. Bunu da istekleri imzlayarak sağlıyoruz. SimpleDB’ye kimlik doğrulamak için imzamızı üç basit aşamada oluşturabiliyoruz. Bu aşamalar:

  1. Servise göndereceğimiz REST isteğini oluşturuyoruz.
  2. Bu isteğe göre imzalamamız gereken metni oluşturuyor ve bu metni HMAC’a göre imzalıyoruz.
  3. İmzayı ve Access Key ID’yi REST isteğine ekleyip; isteği AWS’ye gönderiyoruz.

REST İsteğini Oluşturma

Bu en kolay kısmı. REST isteği bu aşamada key’ler ve value’lar dan oluşan bir Dictionary aslında. Bu istek çağıracağımız fonksiyona göre bazı değişiklikler içerse de aşağıdaki değerler sürekli bulunmak zorunda.

  • AWSAccessKeyId
  • SignatureVersion
  • SignatureMethod
  • Version
  • Timestamp

Bunlardan ilk dördünü Configuration sınıfımızda tanımladık zaten. Timestamp ise ISO8601 (“yyyy-MM-dd\\THH:mm:ss.fff\\Z”) formatında tarihi ifade ediyor. Bu tarihi aşağıdaki kodla kolayca oluşturabiliriz:

public const string ISO8601DateFormat = "yyyy-MM-dd\\THH:mm:ss.fff\\Z";

public static string FormattedCurrentTimestampISO8601
{
    get
    {
        return GetFormattedTimestampISO8601(0);
    }
}

public static string GetFormattedTimestampISO8601(int minutesFromNow)
{
    DateTime dateTime = DateTime.UtcNow.AddMinutes(minutesFromNow);
    DateTime formatted = new DateTime(
        dateTime.Year,
        dateTime.Month,
        dateTime.Day,
        dateTime.Hour,
        dateTime.Minute,
        dateTime.Second,
        dateTime.Millisecond,
        DateTimeKind.Local
        );

    return formatted.ToString(
        ISO8601DateFormat,
        CultureInfo.InvariantCulture
        );
}

Yukarıdaki kodu, AWS’nin .Net SDK’sından kopyaladım.

SignatureVersion için güncel değer ben bu yazıyı yazdığım sırada 2’ydi. 1 numaralı versiyon eski ve yeni sürümlerde destelenmeyecek.

SignatureMethod kullandığınız algoritmaya göre “HmacSHA1” ya da “HmacSHA256” olabilir. Ben SHA256’ya daha fazla güvendiğimden “HmacSHA256” kullanıyorum; ama tamamen duygusal.

İmzalanacak Metni Oluşturma

  1. REST isteğinde AWS’ye göndereceğimiz parametreleri alfabetik olarak sıralayın.
  2. Parametre değerlerini ve isimlerini şu kurallara göre düzenleyin:
    1. RFC 3986’da rezerve edilmemiş herhangi bir karakter encode edilmemeli. (A-Z ve a-z İngilizce harfler, 0-9 arası rakamlar, tire “-”, altçizgi “_”, nokta ve tilde “~” )
    2. Encode edilecek karakterlerin ASCII’si hex olarak % işaretinden sonra 0-F arası rakamlar kullanılarak encode edilmeli. (%9a gerçersiz, %9A geçerli)
    3. UTF-8 karakterler byte byte encode edilmeli (%XY%ZA…)
    4. Boşluk karakteri %20 olarak encode edilmeli (HttpUtility.UrlEncode’un yaptığı gibi “+” olarak değil)
  3. Parametreleri ve değerlerini “=” ile ayırın, değeri boş ise bile “=” kullanın.
  4. Parametreleri birbirinden “&” ile ayrın.

Not: Alfabetik olarak ilk sırada olmasa bile ASWAccessKeyId en başta olmalı.

Öncelikle kendi UrlEncode fonksiyonumuzu yazmalıyız. Bu fonksiyonu doğrudan Amazon SDK’sından aldım.

public const string ValidUrlCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";

public static string UrlEncode(string data, bool path)
{
    StringBuilder encoded = new StringBuilder(data.Length * 2);
    string unreservedChars = String.Concat(
        ValidUrlCharacters,
        (path ? "/:" : "")
        );

    foreach (char symbol in System.Text.Encoding.UTF8.GetBytes(data))
    {
        if (unreservedChars.IndexOf(symbol) != -1)
        {
            encoded.Append(symbol);
        }
        else
        {
            encoded.Append("%").Append(String.Format("{0:X2}", (int)symbol));
        }
    }

    return encoded.ToString();
}

Bu kadar açıklamadan sonra imzalayacağımız metni aşağıdaki kod ile oluşturabiliriz.

public static string CalculateStringToSignSimbleDb(IDictionary<string, string> parameters, string serviceUrl)
{
    StringBuilder data = new StringBuilder("POST\n"); ;

    Uri endpoint = new Uri(serviceUrl);

    data.Append(endpoint.Host.ToLowerInvariant());
    data.Append("\n");
    string uri = endpoint.AbsolutePath;
    if (uri == null || uri.Length == 0)
    {
        uri = "/";
    }

    data.Append(uri);
    data.Append("\n");

    if (parameters.ContainsKey("AWSAccessKeyId"))
    {
        data.Append(Helpers.UrlEncode("AWSAccessKeyId", false));
        data.Append("=");

        data.Append(Helpers.UrlEncode(parameters["AWSAccessKeyId"], false));
        data.Append("&");
    }

    foreach (KeyValuePair pair in parameters.OrderBy(p => p.Key.ToUpperInvariant()))
    {
        if (pair.Key == "AWSAccessKeyId") continue;

        if (pair.Value != null)
        {
            data.Append(Helpers.UrlEncode(pair.Key, false));
            data.Append("=");
            data.Append(Helpers.UrlEncode(pair.Value, false));
            data.Append("&");
        }
    }


    string result = data.ToString();
    return result.Remove(result.Length - 1);
}

Burada “parameters“ parametresi REST isteğimizde göndereceğimiz parametreleri, “serviceUrl” ise bağlanacağımız servisin tam adresini içeriyor. Şu aşamada bu adres, Configuration.SimpleDbServiceUrl’e eşit.

Bu metni oluşturmadan önce REST ve sonra yapmamız gereken işlemler için aşağıdaki kodu yazıyoruz

private static void ConfigureParameters(IDictionary<string, string> values)
{
    if (values.ContainsKey("Signature"))
    {
        values.Remove("Signature");
    }

    values["AWSAccessKeyId"] = Configuration.Key;
    values["SignatureVersion"] = Configuration.SignatureVersion;
    values["SignatureMethod"] = Configuration.SignatureMethod;
    values["Timestamp"] = Helpers.FormattedCurrentTimestampISO8601;
    values["Version"] = Configuration.ServiceVersion;

    var sign = CalculateStringToSignSimbleDb(values, Configuration.SimpleDbServiceUrl);
    var auth = Helpers.HMACSign(sign, Configuration.SecretKey, HashAlgorithmType.SHA256);

    values["Signature"] = auth;
}

Bu kodu kısaca açıklayayım isterseniz. Öncelikle, parametrelerimiz arasında istek imzalanmadan önce “Signature” bulunamaz, bu nedenle eğer varsa siliyoruz. Eklenmesi zorunlu olan değerleri ekliyor ya da zaten varsalar güncelliyoruz. Bu aşamada, imzalayacağımız metni de oluşturuyor ve HMAC ile imzalıyoruz.

İmzalama işleminden sonra hesapladığımız değeri “Signature” parametresi olarak isteğe ekliyoruz.

İçeriği HMAC ile imzalamak için aşağıdaki kodu kullanıyoruz:

public static string HMACSign(string dataToSign, string key, HashAlgorithmType algoritm)
{
    var hashKey = Encoding.UTF8.GetBytes(key);
    HMAC hasher = null;

    switch (algoritm)
    {
        case HashAlgorithmType.SHA1:
            hasher = new HMACSHA1(hashKey);
            break;

        case HashAlgorithmType.SHA256:
            hasher = new HMACSHA256(hashKey);
            break;
    }


    var hashedData = hasher.ComputeHash(Encoding.UTF8.GetBytes(dataToSign));

    return Convert.ToBase64String(hashedData);
}

Bu fonksiyon aşağıdaki enum'a ihtiyaç duyuyor:

public enum HashAlgorithmType
{
    SHA1,
    SHA256
}

Bu makaledeki kodları buradan indirebilirsiniz.

Devamı yarın…

Tags: , , , ,

C# | Cloud | Windows Phone

+1

Hakkımda

Yazar, yazmadığı zamanlarda yazmayı özlemeyi sevmektedir. Elektronik Mühendisliğinde okusa da okulu uzatmış bulunmaktadır. IQ'sunu merak etmekle beraber, sizinkini daha çok merak etmektedir.