Azure Cloud Services (klasik) ve ASP.NET kullanmaya başlama

Genel Bakış

Önemli

Cloud Services (klasik) artık yeni müşteriler için kullanımdan kaldırılmıştır ve tüm müşteriler için 31 Ağustos 2024'te kullanımdan kaldırılacaktır. Yeni dağıtımlarda yeni Azure Resource Manager tabanlı dağıtım modeli Azure Cloud Services (genişletilmiş destek) kullanılmalıdır.

Bu öğreticide ASP.NET MVC ön ucuyla çok katmanlı bir .NET uygulaması oluşturma ve bir Azure bulut hizmetine dağıtma işlemi gösterilmektedir. Uygulama Azure SQL Veritabanı, Azure Blob hizmeti ve Azure Queue hizmeti kullanır. MSDN Kod Galerisi’nden Visual Studio projesini indirebilirsiniz.

Öğreticide, uygulamayı yerel olarak oluşturup çalıştırma, Azure’a dağıtma ve bulutta çalıştırmanın yanı sıra sıfırdan oluşturma işlemleri de gösterilmektedir. Tercih ederseniz sıfırdan oluşturmaya başlayabilir ve ardından test ve dağıtım adımlarını gerçekleştirebilirsiniz.

Contoso Ads uygulaması

Uygulama bir reklam bülteni panosudur. Kullanıcılar metin girerek ve görüntüyü karşıya yükleyerek bir reklam oluşturur. Küçük resim görüntüleriyle birlikte bir reklam listesi görebilir ve ayrıntılarını görmek üzere bir reklam seçtiklerinde tam boyutlu görüntüyü görebilirler.

Reklam listesini gösteren görüntü

Uygulama bir arka uç işleminde küçük resim oluşturmaya yönelik CPU yoğunluklu iş yükünü azaltmak üzere kuyruk merkezli çalışma deseni kullanır.

Alternatif mimari: App Service ve Web İşleri

Bu öğreticide bir Azure bulut hizmetinde hem ön ucun hem de arka ucun nasıl çalıştırılacağı gösterilmektedir. Alternatif olarak ön ucu Azure App Service çalıştırabilir ve arka uç için Web İşleri özelliğini kullanabilirsiniz. WebJobs kullanan bir öğretici için bkz. Azure WebJobs SDK ile Çalışmaya Başlama. Senaryonuza en uygun hizmetleri seçme hakkında bilgi için bkz. Azure App Service, Cloud Services ve sanal makine karşılaştırması.

Öğrenecekleriniz

  • Azure SDK’sını yükleyerek Azure dağıtımı için makinenizi etkinleştirme.
  • Bir ASP.NET MVC web rolü ve çalışan rolü ile Visual Studio bulut hizmeti projesi oluşturma.
  • Azure Depolama Öykünücüsü'ni kullanarak bulut hizmeti projesini yerel olarak test etme.
  • Bulut projesini bir Azure bulut hizmetinde yayımlama ve Azure Storage hesabını kullanarak test etme.
  • Dosyaları karşıya yükleme ve Azure Blob hizmetine depolama.
  • Katmanlar arasında iletişim için Azure Queue hizmetini kullanma.

Önkoşullar

Öğretici web rolü ve çalışan rolü terminolojisi gibi Azure bulut hizmetleri hakkında temel kavramları anladığınızı varsayar. Ayrıca Visual Studio’da ASP.NET MVC veya Web Forms projeleri ile nasıl çalışılacağını bildiğinizi varsayar. Örnek uygulama MVC kullanır, ancak öğreticinin büyük bölümü Web Forms için de geçerlidir.

Uygulamayı bir Azure aboneliği olmadan yerel olarak çalıştırabilirsiniz, ancak uygulamayı buluta dağıtmak için bir abonelik gerekecektir. Bir hesabınız yoksa, MSDN abone avantajlarınızı etkinleştirebilir veya ücretsiz deneme için kaydolabilirsiniz.

Öğretici yönergeleri aşağıdaki ürünlerden herhangi biriyle çalışır:

  • Visual Studio 2013
  • Visual Studio 2015
  • Visual Studio 2017
  • Visual Studio 2019

Bunlardan birine sahip değilseniz Azure SDK'yı yüklediğinizde Visual Studio otomatik olarak yüklenebilir.

Uygulama mimarisi

Uygulama, tablolar oluşturmak ve verilere erişmek için Entity Framework Code First kullanarak reklamları bir SQL veritabanına depolar. Her reklam için veritabanı, biri tam boyutlu görüntü ve diğeri küçük resim olmak üzere iki URL depolar.

Bu bir Reklam tablosunun resmidir

Bir kullanıcı görüntü yüklediğinde bir web rolünde çalışan ön uç görüntüyü bir Azure blob’a depolar ve reklam bilgilerini blob’u işaret eden bir URL ile birlikte veritabanına depolar. Aynı zamanda bir Azure kuyruğuna ileti yazar. Bir çalışan rolünde çalışan arka uç işlemi, kuyruğu yeni iletiler için düzenli olarak yoklar. Yeni bir ileti görüntülendiğinde çalışan rolü bu görüntü için bir küçük resim oluşturur ve küçük resim URL'si veritabanı alanını bu reklam için güncelleştirir. Aşağıdaki diyagramda uygulama bölümlerinin nasıl etkileşim kurduğu gösterilmektedir.

Uygulama bölümlerinin nasıl etkileşim kurduğunu gösteren diyagram.

Geliştirme ortamını ayarlama

Başlamak için Visual Studio ve Azure SDK ile geliştirme ortamınızı ayarlayın.

  • Visual Studio 2019, Azure SDK'sını içerir. Visual Studio 2019 kullanıyorsanız geliştirme ortamı için ek kurulum gerekmez.

  • Visual Studio 2015'te Visual Studio 2015 için Azure SDK'yı yüklemek için aşağıdaki bağlantıya tıklayın.

  • Visual Studio 2013'te Visual Studio 2013 için Azure SDK'yı yüklemek için aşağıdaki bağlantıya tıklayın.

  • Visual Studio yüklü değilse, Azure SDK ile Visual Studio 2019'u yüklemek için aşağıdakileri kullanın.

Not

Makinenizde zaten bulunan SDK bağımlılığı sayısına bağlı olarak, SDK'nın yüklenmesi uzun sürebilir (birkaç dakika ile yarım saat arasında).

Tamamlanan çözümü indirme ve çalıştırma

  1. Tamamlanan çözümü indirip sıkıştırmasını açın.

  2. Visual Studio’yu çalıştırın.

  3. Dosya menüsünden Proje Aç’ı seçin, çözümü indirdiğiniz yere gidin ve ardından çözüm dosyasını açın.

  4. Çözümü derlemek için CTRL+SHIFT+B'ye basın.

    Varsayılan olarak Visual Studio, .zip dosyasına dahil edilmeyen NuGet paketini otomatik olarak geri yükler. Paketler geri yüklenmezse Çözüm için NuGet Paketlerini Yönet iletişim kutusuna gidip sağ üst köşedeki Geri Yükle düğmesine tıklayarak el ile yükleyin.

  5. Çözüm Gezgini’nde başlangıç projesi olarak ContosoAdsCloudService öğesinin seçildiğinden emin olun.

  6. Visual Studio 2015 veya sonraki bir sürümü kullanıyorsanız ContosoAdsWeb projesinin uygulama Web.config dosyasında SQL Server bağlantı dizesini ve ContosoAdsCloudService projesinin ServiceConfiguration.Local.cscfg dosyasını değiştirin. Her iki örnekte de "(localdb)\v11.0" seçeneğini "(localdb)\MSSQLLocalDB" olarak değiştirin.

  7. Uygulamayı çalıştırmak için CTRL+F5'e basın.

    Bir bulut hizmeti projesini yerel olarak çalıştırdığınızda Visual Studio, Azure işlem öykünücüsü ve Azure depolama öykünücüsünü otomatik olarak çağırır. İşlem öykünücüsü, web rolü ve çalışan rolü ortamlarını benzetmek için bilgisayarınızın kaynaklarını kullanır. Depolama öykünücüsü Azure bulut depolamayı benzetmek için bir SQL Server Express LocalDB veritabanı kullanır.

    Bir bulut hizmeti projesini ilk kez çalıştırdığınızda öykünücülerin başlatılması yaklaşık bir dakika sürer. Öykünücü başlatma tamamlandığında varsayılan tarayıcıda uygulama giriş sayfası açılır.

    Contoso Ads mimarisi 1

  8. Reklam Oluştur'a tıklayın.

  9. Bazı test verilerini girin ve karşıya yüklenecek bir .jpg görüntüsü seçip Oluştur’a tıklayın.

    Sayfa oluştur'u gösteren görüntü

    Uygulama Dizin sayfasına gider, ancak işleme henüz tamamlanmadığından yeni reklam için bir küçük resim göstermez.

  10. Biraz bekleyin ve ardından küçük resmi görmek için Dizin sayfasını yenileyin.

    Dizin sayfası

  11. Tam boyutlu görüntüyü görmek için reklamınıza ilişkin Ayrıntılar’a tıklayın.

    Ayrıntılar sayfası

Uygulamayı herhangi bir bulut bağlantısı olmadan tamamen yerel bilgisayarınızda çalıştırıyorsunuz. Depolama öykünücüsü kuyruk ve blob verilerini bir SQL Server Express LocalDB veritabanına, uygulama ise reklam verilerini başka bir LocalDB veritabanına depolar. Entity Framework Code First, web uygulaması ilk kez erişmeye çalıştığında reklam veritabanını otomatik olarak oluşturmuştur.

Aşağıdaki bölümde çözümü bulutta çalışan kuyruklar, blob’lar ve uygulama veritabanı için Azure bulut kaynakları kullanacak şekilde yapılandıracaksınız. Yerel olarak çalıştırmaya devam ederken bulut depolama alanını ve veritabanı kaynaklarını da kullanmak istiyorsanız bunu yapabilirsiniz. Bunun için yalnızca bağlantı dizesi ayarlarını yapmanız gerekir. Bu ayarları nasıl yapacağınızı ileride öğreneceksiniz.

Uygulamayı Azure'a dağıtma

Uygulamayı bulutta çalıştırmak için aşağıdaki adımları gerçekleştirin:

  • Bir Azure bulut hizmeti oluşturun.
  • Azure SQL Veritabanında bir veritabanı oluşturun.
  • Bir Azure Storage hesabı oluşturun.
  • Azure'da çalıştırıldığında veritabanınızı kullanmak için çözümü yapılandırın.
  • Çözümünüzü Azure’da çalıştığında Azure Storage hesabınızı kullanacak şekilde yapılandırın.
  • Projeyi Azure bulut hizmetinize dağıtın.

Bir Azure bulut hizmeti oluşturma

Azure bulut hizmeti, uygulamanın çalıştırılacağı ortamıdır.

  1. Tarayıcınızda Azure portalı’nı açın.

  2. Kaynak > oluştur İşlem > Bulut Hizmeti'ne tıklayın.

  3. DNS adı giriş kutusuna bulut hizmeti için bir URL ön eki girin.

    Bu URL benzersiz olmalıdır. Seçtiğiniz ön ek zaten kullanılıyorsa bir hata iletisi alırsınız.

  4. Hizmet için yeni bir Kaynak grubu belirtin. Yeni oluştur’a tıklayın ve Kaynak grubu giriş kutusuna CS_contososadsRG gibi bir ad yazın.

  5. Uygulamayı dağıtmak istediğiniz bölgeyi seçin.

    Bu alan, bulut hizmetinizin hangi veri merkezinde barındırılacağını belirtir. Bir üretim uygulaması için müşterilerinize en yakın bölgeyi seçmeniz gerekir. Bu öğretici için size en yakın bölgeyi seçin.

  6. Oluştur’a tıklayın.

    Aşağıdaki görüntüde bulut hizmeti CSvccontosoads.cloudapp.net URL’si ile oluşturulur.

    Yeni Bulut Hizmeti'ni gösteren görüntü

Azure SQL Veritabanında veritabanı oluşturma

Uygulama bulutta çalıştırıldığında bulut tabanlı bir veritabanı kullanır.

  1. Azure portal Kaynak Veritabanları > SQL Veritabanı oluştur'a >tıklayın.

  2. Veritabanı Adı kutusuna contosoads yazın.

  3. Kaynak grubu’nda Var olanı kullan’a tıklayın ve bulut hizmeti için kullanılan kaynak grubunu seçin.

  4. Aşağıdaki görüntüde, Sunucu - Gerekli ayarları yapılandır’a ve Yeni sunucu oluştur’a tıklayın.

    Veritabanı sunucusu için tünel

    Alternatif olarak, aboneliğiniz zaten bir sunucuya sahipse aşağı açılan listeden bu sunucuyu seçebilirsiniz.

  5. Sunucu adı kutusuna csvccontosodbserver’ı girin.

  6. Bir yönetici için Kullanıcı Adı ve Parola girin.

    Yeni sunucu oluştur’u seçtiyseniz buraya mevcut bir adı ve parolayı girmezsiniz. Daha sonra veritabanına eriştiğinizde kullanmak için şu anda tanımladığınız bir adı ve parolayı girersiniz. Daha önce oluşturduğunuz bir sunucuyu seçtiyseniz önceden oluşturduğunuz yönetici kullanıcı hesabı için parola istenir.

  7. Bulut hizmeti için seçtiğiniz aynı Konum’u seçin.

    Bulut hizmeti ve veritabanı farklı veri merkezlerinde (farklı bölgelerde) olduğunda gecikme artar ve veri merkezinin dışındaki bant genişliği için sizden ücret alınır. Bir veri merkezi içinde bant genişliği ücretsizdir.

  8. Azure hizmetlerinin sunucuya erişmesine izin ver seçeneğini işaretleyin.

  9. Yeni sunucu için Seçin’e tıklayın.

    Yeni sunucu

  10. Oluştur’a tıklayın.

Azure depolama hesabı oluşturma

Azure Storage hesabı kuyruk ve blob verilerini buluta depolamaya yönelik kaynaklar sağlar.

Gerçek bir uygulamada genellikle uygulama verilerine karşı günlük verileri için ve test verilerine karşı üretim verileri için ayrı hesaplar oluşturursunuz. Bu öğreticide yalnızca tek bir hesap kullanacaksınız.

  1. Azure portalKaynak > depolama > hesabı oluştur - blob, dosya, tablo, kuyruk'a tıklayın.

  2. Ad kutusuna bir URL ön eki girin.

    Bu ön ek ile birlikte kutunun altında gördüğünüz metin, depolama hesabınızın benzersiz URL’si olacaktır. Girdiğiniz ön ek başka bir kişi tarafından zaten kullanılıyorsa farklı bir ön ek seçmeniz gerekir.

  3. Dağıtım modeli’ni Klasik olarak ayarlayın.

  4. Çoğaltma açılır listesini Yerel olarak yedekli depolama olarak ayarlayın.

    Bir depolama hesabı için coğrafi çoğaltma etkinleştirildiğinde, birincil konumda önemli bir olağanüstü durum oluşursa yük devretmeyi etkinleştirmek için depolanan içerik ikincil bir veri merkezine çoğaltılır. Coğrafi çoğaltma ek ücretlere neden olabilir. Test ve geliştirme hesaplarında genellikle coğrafi çoğaltma için ödeme yapmak istemezsiniz. Daha fazla bilgi için bkz. Depolama hesabı oluşturma, yönetme veya silme.

  5. Kaynak grubu’nda Var olanı kullan’a tıklayın ve bulut hizmeti için kullanılan kaynak grubunu seçin.

  6. Konum açılır listesini bulut hizmeti için seçtiğiniz aynı bölgeye ayarlayın.

    Bulut hizmeti ve depolama hesabı farklı veri merkezlerinde (farklı bölgelerde) olduğunda gecikme artar ve veri merkezinin dışındaki bant genişliği için sizden ücret alınır. Bir veri merkezi içinde bant genişliği ücretsizdir.

    Azure benzeşim grupları bir veri merkezinde bulunan kaynaklar arasındaki uzaklığı en aza indirmeye yönelik bir mekanizma sağlar. Bu öğretici benzeşim gruplarını kullanmaz. Daha fazla bilgi için bkz. Azure’da Benzeşim Grubu Oluşturma.

  7. Oluştur’a tıklayın.

    Yeni depolama hesabı

    Görüntüde csvccontosoads.core.windows.net URL’si ile bir depolama hesabı oluşturulmuştur.

Çözümü Azure'da çalıştırıldığında veritabanınızı Azure SQL Veritabanı'nda kullanacak şekilde yapılandırma

Web projesi ve çalışan rolü projesinin her birinin kendi veritabanı bağlantı dizesi vardır ve uygulama Azure'da çalıştırıldığında her birinin Azure SQL Veritabanındaki veritabanına işaret etmesi gerekir.

Web rolü için bir Web.config dönüşümü ve çalışan rolü için bir bulut hizmet ortamı ayarı kullanacaksınız.

Not

Bu ve sonraki bölümde, kimlik bilgilerini proje dosyalarında depolarsınız. Hassas verileri ortak kaynak kodu depolarına kaydetmeyin.

  1. ContosoAdsWeb projesinde uygulama Web.config dosyasının Web.Release.config dönüşüm dosyasını açın, bir <connectionStrings> öğesi içeren açıklama bloğunu silin ve aşağıdaki kodu yerine yapıştırın.

    <connectionStrings>
        <add name="ContosoAdsContext" connectionString="{connectionstring}"
        providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
    

    Dosyayı düzenlemek için açık bırakın.

  2. Azure portalı’nda sol bölmedeki SQL Veritabanları’na, bu öğretici için oluşturduğunuz veritabanına ve ardından Bağlantı dizelerini göster’e tıklayın.

    Bağlantı dizelerini göster

    Portal, parola için bir yer tutucu ile birlikte bağlantı dizelerini gösterir.

    Bağlantı dizeleri

  3. Web.Release.config dönüşüm dosyasında {connectionstring} öğesini silin ve yerine Azure portalındaki ADO.NET bağlantı dizesini yapıştırın.

  4. Web.Release.config dönüşüm dosyasının içine yapıştırdığınız bağlantı dizesinde {your_password_here} öğesini yeni SQL veritabanı için oluşturduğunuz parola ile değiştirin.

  5. Dosyayı kaydedin.

  6. Bağlantı dizesini (çevresindeki soru işaretleri olmadan) çalışan rolünü yapılandırmaya yönelik aşağıdaki adımlarda kullanılmak üzere seçip kopyalayın.

  7. Çözüm Gezgini’nde bulut hizmeti projesindeki Roller altında ContosoAdsWorker’a ve ardından Özellikler’e tıklayın.

    Özellikler menü seçeneğini vurgulayan ekran görüntüsü.

  8. Ayarlar sekmesine tıklayın.

  9. Hizmet Yapılandırması’nı Bulut olarak değiştirin.

  10. ContosoAdsDbConnectionString ayarı için Değer alanını seçin ve ardından öğreticinin önceki bölümünde kopyaladığınız bağlantı dizesini yapıştırın.

    Çalışan rolü için veritabanı bağlantı dizesi

  11. Yaptığınız değişiklikleri kaydedin.

Çözümünüzü Azure’da çalıştığında Azure Storage hesabınızı kullanacak şekilde yapılandırma

Hem web rolü projesinin hem de çalışan rolü projesinin Azure Storage hesabı bağlantı dizeleri, bulut hizmeti projesindeki ortam ayarlarına depolanır. Her proje için uygulama yerel olarak çalıştığında ve bulutta çalıştığında kullanılacak ayrı ayarlar vardır. Hem web hem de çalışan rolü projeleri için bulut ortamı ayarlarını güncelleştirin.

  1. Çözüm Gezgini’nde ContosoAdsCloudService projesindeki Roller altında ContosoAdsWeb’e sağ tıklayın ve ardından Özellikler’e tıklayın.

    Rol özelliklerini gösteren görüntü

  2. Ayarlar sekmesine tıklayın. Hizmet Yapılandırması açılan kutusunda Bulut'u seçin.

    Bulut yapılandırması

  3. StorageConnectionString girdisini seçtiğinizde satırın sağ uç kısmında bir üç nokta (...) göreceksiniz. Depolama Hesabı Bağlantı Dizesi Oluştur iletişim kutusunu açmak için üç nokta düğmesine tıklayın.

    Bağlantı Dizesi Oluştur kutusunu açma

  4. Depolama Bağlantı Dizesi Oluştur iletişim kutusunda Aboneliğiniz’e tıklayın, daha önce oluşturduğunuz depolama hesabını seçin ve ardından Tamam’a tıklayın. Henüz oturum açmadıysanız Azure hesabı kimlik bilgileriniz istenir.

    Depolama Bağlantı Dizesi oluşturma

  5. Yaptığınız değişiklikleri kaydedin.

  6. Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString bağlantı dizesini ayarlamak için StorageConnectionString bağlantı dizesi için kullandığınız yordamın aynısını izleyin.

    Bu bağlantı dizesi günlüğe kaydetme için kullanılır.

  7. ContosoAdsWeb rolü için ContosoAdsWorker rolünün her iki bağlantı dizesini ayarlamak üzere kullandığınız yordamın aynısını izleyin. Hizmet Yapılandırması’nı Bulut olarak ayarlamayı unutmayın.

Visual Studio kullanıcı arabirimini kullanılarak yapılandırdığınız rol ortamı ayarları ContosoAdsCloudService projesinde aşağıdaki dosyalara depolanır:

  • ServiceDefinition.csdef - Ayar adlarını tanımlar.
  • ServiceConfiguration.Cloud.cscfg - Uygulamanın yerel olarak çalıştığı durumlar için değerler sağlar.
  • ServiceConfiguration.Local.cscfg - Uygulamanın yerel olarak çalıştığı durumlar için değerler sağlar.

Örneğin, ServiceDefinition.csdef aşağıdaki tanımları içerir:

<ConfigurationSettings>
    <Setting name="StorageConnectionString" />
    <Setting name="ContosoAdsDbConnectionString" />
</ConfigurationSettings>

ServiceConfiguration.Cloud.cscfg dosyası ise Visual Studio’da bu ayarlar için girdiğiniz değerleri içerir.

<Role name="ContosoAdsWorker">
    <Instances count="1" />
    <ConfigurationSettings>
        <Setting name="StorageConnectionString" value="{yourconnectionstring}" />
        <Setting name="ContosoAdsDbConnectionString" value="{yourconnectionstring}" />
        <!-- other settings not shown -->

    </ConfigurationSettings>
    <!-- other settings not shown -->

</Role>

<Instances> ayarı Azure’un çalışan rolü kodunu çalıştıracağı sanal makine sayısını belirtir. Sonraki adımlar bölümünde bir bulut hizmetinin ölçeğini artırma hakkında daha fazla bilgi içeren bağlantılar bulunur.

Projeyi Azure’a dağıtma

  1. Çözüm Gezgini’nde ContosoAdsCloudService bulut projesine sağ tıklayın ve ardından Yayımla öğesini seçin.

    Yayımlama menüsü

  2. Azure Uygulaması Yayımlama sihirbazının Oturum aç adımında Sonraki öğesine tıklayın.

    Oturum açma adımı

  3. Sihirbazın Ayarlar adımında İleri’ye tıklayın.

    Ayarlar adımı

    Gelişmiş sekmesindeki varsayılan ayarlar bu öğretici için uygundur. Gelişmiş sekmesi hakkında bilgi için bkz. Azure Uygulaması Yayımlama Sihirbazı.

  4. Özet adımında Yayımla öğesine tıklayın.

    Özet adımı

    Visual Studio’da Azure Etkinlik Günlüğü penceresi açılır.

  5. Dağıtım ayrıntılarını genişletmek için sağ ok simgesine tıklayın.

    Dağıtımın tamamlanması 5 dakika veya daha fazla sürebilir.

    Azure Etkinlik Günlüğü penceresi

  6. Dağıtım durumu tamamlandığında uygulamayı başlatmak için Web uygulaması URL'si öğesine tıklayın.

  7. Uygulamayı yerel olarak çalıştırdığınızda yaptığınız gibi reklam oluşturarak, görüntüleyerek ve bazılarını düzenleyerek uygulamayı test edebilirsiniz.

Not

Testi tamamladığınızda bulut hizmetini silin veya durdurun. Bulut hizmeti kullanmıyorsanız bile onun için sanal makine kaynakları ayrılmış olduğundan ücretler tahakkuk eder. Ayrıca çalışır durumda bırakırsanız, URL’nizi bulan herhangi bir kişi reklam oluşturabilir ve görüntüleyebilir. Azure portalı’nda bulut hizmetinizin Genel Bakış sekmesine gidin ve ardından sayfanın üstündeki Sil düğmesine tıklayın. Başkalarının siteye erişmesini yalnızca geçici olarak engellemek istiyorsanız bunun yerine Durdur’a tıklayın. Bu durumda ücretler tahakkuk etmeye devam eder. Artık ihtiyacınız kalmadığında SQL veritabanını ve depolama hesabını silmek için benzer bir yordamı izleyebilirsiniz.

Uygulamayı sıfırdan oluşturma

Tamamlanmış uygulamayı daha önce yüklemediyseniz şimdi yapın. İndirilen projedeki dosyaları yeni projeye kopyalayın.

Contoso Ads uygulamasının oluşturulması aşağıdaki adımları içerir:

  • Bir bulut hizmeti Visual Studio çözümü oluşturun.
  • NuGet paketlerini güncelleştirin ve ekleyin.
  • Proje başvurularını ayarlayın.
  • Bağlantı dizelerini yapılandırın.
  • Kod dosyaları ekleyin.

Çözüm oluşturulduktan sonra bulut hizmeti projelerinde ve Azure blob'ları ile kuyruklarda benzersiz olan kodu gözden geçirin.

Bir bulut hizmeti Visual Studio çözümü oluşturma

  1. Visual Studio'da Dosya menüsünden Yeni Proje’yi seçin.

  2. Yeni Proje iletişim kutusunun sol bölmesinde Visual C# öğesini genişletin ve Bulut şablonlarını, ardından Azure Cloud Service şablonunu seçin.

  3. Projeyi ve çözümü ContosoAdsCloudService olarak adlandırın ve ardından Tamam’a tıklayın.

    Yeni Proje

  4. Yeni Azure Bulut Hizmeti iletişim kutusunda bir web rolü ve bir çalışan rolü ekleyin. Web rolünü ContosoAdsWeb olarak ve çalışan rolünü ContosoAdsWorker olarak adlandırın. (Rollerin varsayılan adlarını değiştirmek için sağ bölmedeki kurşun kalem simgesini kullanın.)

    Yeni Bulut Hizmeti Projesi

  5. Web rolü için Yeni ASP.NET Projesi iletişim kutusunu gördüğünüzde MVC şablonunu seçin ve ardından Kimlik Doğrulamayı Değiştir’e tıklayın.

    Kimlik Doğrulamasını değiştirin

  6. Kimlik Doğrulamayı Değiştir iletişim kutusunda Kimlik Doğrulaması Yok’u seçin ve ardından Tamam’a tıklayın.

    Kimlik Doğrulaması Yok

  7. Yeni ASP.NET Projesi iletişim kutusunda Tamam’a tıklayın.

  8. Çözüm Gezgini’nde çözüme (projelerden birine değil) sağ tıklayın ve Ekle - Yeni Proje’yi seçin.

  9. Yeni Proje Ekle iletişim kutusunda sol bölmedeki Visual C# altında bulunan Windows’u seçin ve ardından Sınıf Kitaplığı şablonuna tıklayın.

  10. Projeyi ContosoAdsCommon olarak adlandırın ve ardından Tamam’a tıklayın.

    Entity Framework bağlamına ve hem web hem de çalışan rolü projelerindeki veri modeline başvurmanız gerekir. Alternatif olarak, web rolü projesinde EF ile ilgili sınıfları tanımlayabilir ve çalışan rolü projesinde bu projeye başvurabilirsiniz. Ancak, alternatif yaklaşımda çalışan rolü projeniz gerekli olmayan web bütünleştirme kodlarına başvuruda bulunur.

NuGet paketlerini güncelleştirme ve ekleme

  1. Çözüm için NuGet Paketlerini Yönet iletişim kutusunu açın.

  2. Pencerenin en üstündeki Güncelleştirmeler’i seçin.

  3. WindowsAzure.Storage paketini arayın ve listede varsa onu ve içinde güncelleştirileceği web ve çalışan projelerini seçin, ardından Güncelleştir’e tıklayın.

    Depolama istemcisi kitaplığı Visual Studio proje şablonlarından daha sık güncelleştirildiği için yeni oluşturulan bir projedeki sürümün güncelleştirilmesi gerektiğini sık sık görürsünüz.

  4. Pencerenin en üstünde Gözat’ı seçin.

  5. EntityFramework NuGet paketini bulun ve üç projenin tamamına yükleyin.

  6. Microsoft.WindowsAzure.ConfigurationManager NuGet paketini bulun ve çalışan rolü projesine yükleyin.

Proje başvurularını ayarlama

  1. ContosoAdsWeb projesinde ContosoAdsCommon projesine bir başvuru ayarlayın. ContosoAdsWeb projesine sağ tıklayın ve ardından Başvurular - Başvuru Ekle'ye tıklayın. Başvuru Yöneticisi iletişim kutusunda sol bölmedeki Çözüm – Projeler öğesini seçin, ContosoAdsCommon’ı seçin ve ardından Tamam’a tıklayın.

  2. ContosoAdsWorker projesinde ContosoAdsCommon projesine bir başvuru ayarlayın.

    ContosoAdsCommon hem ön uç ve arka uç tarafından kullanılacak olan Entity Framework veri modeli ve bağlam sınıfını içerir.

  3. ContosoAdsWorker projesinde bir System.Drawing başvurusu ayarlayın.

    Bu bütünleştirilmiş kod, görüntüleri küçük resimlere dönüştürmek için arka uç tarafından kullanılır.

Bağlantı dizelerini yapılandırma

Bu bölümde, yerel olarak test etmek amacıyla Azure Storage ve SQL bağlantı dizelerini yapılandırırsınız. Öğreticinin önceki bölümlerinde verilen dağıtım yönergeleri, uygulamanın bulutta çalıştığı durumlar için bağlantı dizelerinin nasıl ayarlandığını açıklamaktadır.

  1. ContosoAdsWeb projesinde uygulamanın Web.config dosyasını açın ve aşağıdaki connectionStrings öğesini configSections öğesinden sonra ekleyin.

    <connectionStrings>
        <add name="ContosoAdsContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=ContosoAds; Integrated Security=True; MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    Visual Studio 2015 ve sonraki bir sürümü kullanıyorsanız "v11.0" ifadesini "MSSQLLocalDB" ile değiştirin.

  2. Yaptığınız değişiklikleri kaydedin.

  3. ContosoAdsCloudService projesinde Roller altındaki ContosoAdsWeb öğesine sağ tıklayın ve ardından Özellikler’e tıklayın.

    Rol özellikleri resmi

  4. ContosoAdsWeb [Rol] özellikleri penceresinde Ayarlar sekmesine ve ardından Ayar Ekle'ye tıklayın.

    Hizmet Yapılandırma ayarını Tüm Yapılandırmalar olarak bırakın.

  5. StorageConnectionString adlı bir ayar ekleyin. Tür değerini ConnectionString olarak, Değer seçeneğini UseDevelopmentStorage=true olarak ayarlayın.

    Yeni bağlantı dizesi

  6. Yaptığınız değişiklikleri kaydedin.

  7. ContosoAdsWorker rol özelliklerine bir depolama bağlantı dizesi eklemek için aynı yordamı izleyin.

  8. Hala ContosoAdsWorker [Rolü] özellikler penceresindeyken başka bir bağlantı dizesi ekleyin:

    • Ad: ContosoAdsDbConnectionString

    • Türü: Dize

    • Değer: Web rolü projesi kullandığınız bağlantı dizesinin aynısını yapıştırın. (Aşağıdaki örnek Visual Studio 2013 içindir. Bu örneği kopyaladığınızda Visual Studio 2015 veya üzerini kullanıyorsanız Veri Kaynağı'nı değiştirmeyi unutmayın.)

      Data Source=(localdb)\v11.0; Initial Catalog=ContosoAds; Integrated Security=True; MultipleActiveResultSets=True;
      

Kod dosyalarını ekleme

Bu bölümde, indirilen çözümden yeni çözüme kod dosyaları kopyalarsınız. Aşağıdaki bölümlerde bu kodun temel kısımları gösterilmiş ve açıklanmıştır.

Bir projeye veya klasöre dosya eklemek için projeye veya klasöre sağ tıklayın veVarolan ÖğeYiEkle'ye - tıklayın. İstediğiniz dosyaları seçin ve ardından Ekle’ye tıklayın. Mevcut dosyaları değiştirmek isteyip istemediğiniz sorulursa Evet’e tıklayın.

  1. ContosoAdsCommon projesinde Class1.cs dosyasını silin ve indirilen projedeki Ad.cs ve ContosoAdscontext.cs dosyalarını onun yerine ekleyin.

  2. ContosoAdsWeb projesinde indirilen projeden aşağıdaki dosyaları ekleyin.

    • Global.asax.cs.
    • Views\Shared klasöründe: _Layout.cshtml.
    • Görünümler/Giriş klasöründe: Index.cshtml.
    • Denetleyiciler klasöründe: AdController.cs.
    • Görünümler/Reklam klasöründe (öncelikle klasörü oluşturun): beş .cshtml dosyası.
  3. ContosoAdsWorker projesinde indirilen projeden WorkerRole.cs ekleyin.

Uygulamayı artık öğreticinin önceki bölümlerinde anlatılan şekilde derleyip çalıştırabilirsiniz; uygulama yerel veritabanı ve depolama öykünücüsü kaynaklarını kullanacaktır.

Aşağıdaki bölümlerde Azure ortamı, blob'ları ve kuyrukları ile çalışmayla ilgili kod açıklanmaktadır. Bu öğretici, iskele kurma kullanarak MVC denetleyicilerinin ve görünümlerin nasıl oluşturulacağını, SQL Server veritabanları ile çalışan Entity Framework kodunun nasıl yazılacağını veya ASP.NET 4.5 içinde zaman uyumsuz programlamanın temel bilgilerini açıklamaz. Bu konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

ContosoAdsCommon - Ad.cs

Ad.cs dosyası reklam kategorileri için bir numaralandırma ve reklam bilgileri için bir POCO varlık sınıfı tanımlar.

public enum Category
{
    Cars,
    [Display(Name="Real Estate")]
    RealEstate,
    [Display(Name = "Free Stuff")]
    FreeStuff
}

public class Ad
{
    public int AdId { get; set; }

    [StringLength(100)]
    public string Title { get; set; }

    public int Price { get; set; }

    [StringLength(1000)]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [StringLength(1000)]
    [DisplayName("Full-size Image")]
    public string ImageURL { get; set; }

    [StringLength(1000)]
    [DisplayName("Thumbnail")]
    public string ThumbnailURL { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime PostedDate { get; set; }

    public Category? Category { get; set; }
    [StringLength(12)]
    public string Phone { get; set; }
}

ContosoAdsCommon - ContosoAdsContext.cs

ContosoAdsContext sınıfı Reklam sınıfının Entity Framework tarafından bir SQL veritabanına depolanacak olan Db koleksiyonunda kullanıldığını belirtir.

public class ContosoAdsContext : DbContext
{
    public ContosoAdsContext() : base("name=ContosoAdsContext")
    {
    }
    public ContosoAdsContext(string connString)
        : base(connString)
    {
    }
    public System.Data.Entity.DbSet<Ad> Ads { get; set; }
}

Sınıfın iki oluşturucusu vardır. Birincisi web projesi tarafından kullanılır ve Web.config dosyasına depolanan bir bağlantı dizesinin adını belirtir. İkinci oluşturucu, Web.config dosyasına sahip olmadığı için çalışan rolü projesi tarafından kullanılan gerçek bağlantı dizesini geçirmenizi sağlar. Bu bağlantı dizesinin nereye depolandığını daha önce gördünüz ve kodun DbContext sınıfını başlattığında bağlantı dizesini nasıl aldığını daha sonra göreceksiniz.

ContosoAdsWeb - Global.asax.cs

Application_Start yönteminden çağrılan kod, henüz yoksa bir görüntüler blob kapsayıcısı ve bir görüntüler kuyruğu oluşturur. Bunun yapılması yeni bir depolama hesabını başlattığınız veya depolama öykünücüsünü yeni bir bilgisayarda kullanmaya başladığınız her durumda gerekli blob kapsayıcısının ve kuyruğun otomatik olarak oluşturulmasını sağlar.

Kod .cscfg dosyasından depolama bağlantı dizesini kullanarak depolama hesabına erişim elde eder.

var storageAccount = CloudStorageAccount.Parse
    (RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));

Ardından görüntüler blob kapsayıcısına bir başvuru edinir, henüz yoksa kapsayıcıyı oluşturur ve yeni kapsayıcıda erişim izinlerini ayarlar. Varsayılan olarak, yeni kapsayıcılar yalnızca depolama hesabı kimlik bilgilerine sahip istemcilerin blob’lara erişmesine izin verir. Web sitesi, görüntü blob’larını işaret eden URL’leri kullanarak görüntüleri gösterebilmek için blob’ların herkese açık olmasını gerektirir.

var blobClient = storageAccount.CreateCloudBlobClient();
var imagesBlobContainer = blobClient.GetContainerReference("images");
if (imagesBlobContainer.CreateIfNotExists())
{
    imagesBlobContainer.SetPermissions(
        new BlobContainerPermissions
        {
            PublicAccess =BlobContainerPublicAccessType.Blob
        });
}

Benzer bir kod, görüntüler kuyruğuna başvuru edinir ve yeni bir kuyruk oluşturur. Bu durumda hiçbir izin değişikliğine gerek yoktur.

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
var imagesQueue = queueClient.GetQueueReference("images");
imagesQueue.CreateIfNotExists();

ContosoAdsWeb - _Layout.cshtml

_Layout.cshtml dosyası üst bilgi ve alt bilgide uygulama adını ayarlar ve bir "Reklamlar" menü girişi oluşturur.

ContosoAdsWeb - Görünümler\Giriş\Dizin.cshtml

Görünümler\Giriş\Dizin.cshtml dosyası, giriş sayfasında kategori bağlantılarını gösterir. Bağlantılar Category numaralandırmasının bir sorgu dizesi değişkeni içindeki tamsayı değerini Reklam Dizini sayfasına geçirir.

<li>@Html.ActionLink("Cars", "Index", "Ad", new { category = (int)Category.Cars }, null)</li>
<li>@Html.ActionLink("Real estate", "Index", "Ad", new { category = (int)Category.RealEstate }, null)</li>
<li>@Html.ActionLink("Free stuff", "Index", "Ad", new { category = (int)Category.FreeStuff }, null)</li>
<li>@Html.ActionLink("All", "Index", "Ad", null, null)</li>

ContosoAdsWeb - AdController.cs

AdController.cs dosyasında oluşturucu, bloblar ve kuyruklarla çalışmak için bir API sağlayan Azure Depolama İstemci Kitaplığı nesneleri oluşturmak için yöntemini çağırırInitializeStorage.

Ardından kod daha önce gördüğünüz gibi görüntüler blob kapsayıcısı için Global.asax.cs içinde bir başvuru edinir. Bunu yaparken bir web uygulaması için uygun bir varsayılan yeniden deneme ilkesi ayarlar. Varsayılan üstel geri alma yeniden deneme ilkesi, web uygulamasının geçici bir hata için tekrarlanan yeniden denemelerde bir dakikadan uzun süre yanıt vermemeye başlamasını sağlayabilir. Burada belirtilen yeniden deneme ilkesi üç denemeye kadar her denemeden sonra en fazla üç saniye bekler.

var blobClient = storageAccount.CreateCloudBlobClient();
blobClient.DefaultRequestOptions.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3);
imagesBlobContainer = blobClient.GetContainerReference("images");

Benzer bir kod, görüntüler kuyruğuna başvuru edinir.

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
queueClient.DefaultRequestOptions.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3);
imagesQueue = queueClient.GetQueueReference("images");

Denetleyici kodlarının birçoğu bir DbContext sınıfı kullanarak Entity Framework veri modeli ile çalışmak için tipiktir. Dosyayı karşıya yükleyen ve blob depolama alanına kaydeden HttpPost Create yöntemi bunun bir istisnasıdır. Model bağlayıcı, yönteme bir HttpPostedFileBase nesnesi sağlar.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(
    [Bind(Include = "Title,Price,Description,Category,Phone")] Ad ad,
    HttpPostedFileBase imageFile)

Kullanıcı karşıya yüklemek için bir dosya seçtiyse kod bu dosyayı karşıya yükler, bir blob'a kaydeder ve Ad veritabanı kaydını blob’a işaret eden bir URL ile güncelleştirir.

if (imageFile != null && imageFile.ContentLength != 0)
{
    blob = await UploadAndSaveBlobAsync(imageFile);
    ad.ImageURL = blob.Uri.ToString();
}

Karşıya yüklemeyi yapan kod UploadAndSaveBlobAsync yöntemindedir. Blob için bir GUID adı oluşturur, dosyayı karşıya yükler ve kaydeder ve kaydedilmiş blob için bir başvuru döndürür.

private async Task<CloudBlockBlob> UploadAndSaveBlobAsync(HttpPostedFileBase imageFile)
{
    string blobName = Guid.NewGuid().ToString() + Path.GetExtension(imageFile.FileName);
    CloudBlockBlob imageBlob = imagesBlobContainer.GetBlockBlobReference(blobName);
    using (var fileStream = imageFile.InputStream)
    {
        await imageBlob.UploadFromStreamAsync(fileStream);
    }
    return imageBlob;
}

HttpPost Create yöntemi bir blob’u karşıya yükleyip veritabanını güncelleştirdikten sonra bir görüntünün küçük resme dönüştürme için hazır olduğunu ilgili arka uç işlemine bildirmek üzere bir kuyruk iletisi oluşturur.

string queueMessageString = ad.AdId.ToString();
var queueMessage = new CloudQueueMessage(queueMessageString);
await queue.AddMessageAsync(queueMessage);

Kullanıcının yeni bir görüntü dosyası seçtiği durumlarda zaten mevcut blob’ların silinmesinin gerekli olması dışında HttpPost Edit yönteminin kodu aynıdır.

if (imageFile != null && imageFile.ContentLength != 0)
{
    await DeleteAdBlobsAsync(ad);
    imageBlob = await UploadAndSaveBlobAsync(imageFile);
    ad.ImageURL = imageBlob.Uri.ToString();
}

Sonraki örnekte bir reklamı sildiğinizde blob'ları silen kod gösterilmektedir.

private async Task DeleteAdBlobsAsync(Ad ad)
{
    if (!string.IsNullOrWhiteSpace(ad.ImageURL))
    {
        Uri blobUri = new Uri(ad.ImageURL);
        await DeleteAdBlobAsync(blobUri);
    }
    if (!string.IsNullOrWhiteSpace(ad.ThumbnailURL))
    {
        Uri blobUri = new Uri(ad.ThumbnailURL);
        await DeleteAdBlobAsync(blobUri);
    }
}
private static async Task DeleteAdBlobAsync(Uri blobUri)
{
    string blobName = blobUri.Segments[blobUri.Segments.Length - 1];
    CloudBlockBlob blobToDelete = imagesBlobContainer.GetBlockBlobReference(blobName);
    await blobToDelete.DeleteAsync();
}

ContosoAdsWeb - Views\Ad\Index.cshtml ve Details.cshtml

Index.cshtml dosyası küçük resimleri diğer reklam verileriyle birlikte gösterir.

<img src="@Html.Raw(item.ThumbnailURL)" />

Details.cshtml dosyası tam boyutlu görüntüyü gösterir.

<img src="@Html.Raw(Model.ImageURL)" />

ContosoAdsWeb - Views\Ad\Create.cshtml ve Edit.cshtml

Create.cshtml ve Edit.cshtml dosyaları denetleyicinin HttpPostedFileBase nesnesi almasını sağlayan form kodlamasını belirtir.

@using (Html.BeginForm("Create", "Ad", FormMethod.Post, new { enctype = "multipart/form-data" }))

Bir <input> öğesi tarayıcıya bir dosya seçme iletişim kutusu açmasını söyler.

<input type="file" name="imageFile" accept="image/*" class="form-control fileupload" />

ContosoAdsWorker - WorkerRole.cs - OnStart yöntemi

Azure çalışan rolü ortamı, çalışan rolü başlatılırken WorkerRole sınıfındaki OnStart yöntemini, OnStart yöntemi tamamlandığında ise Run yöntemini çağırır.

OnStart yöntemi .cscfg dosyasından veritabanı bağlantı dizesini alır ve Entity Framework DbContext sınıfına geçirir. Varsayılan olarak SQLClient sağlayıcısı kullanılır, bu nedenle sağlayıcının belirtilmesi gerekli değildir.

var dbConnString = CloudConfigurationManager.GetSetting("ContosoAdsDbConnectionString");
db = new ContosoAdsContext(dbConnString);

Bundan sonra yöntem, depolama hesabı için bir başvuru alır ve yoksa blob kapsayıcısı ve kuyruk oluşturur. Bunun kodu, web rolü Application_Start yönteminde daha önce gördüğünüzle aynıdır.

ContosoAdsWorker - WorkerRole.cs - Run yöntemi

OnStart yöntemi başlatma işini tamamladığında Run yöntemi çağrılır. Yöntem yeni bir kuyruk iletisi bekleyen ve ulaşan iletileri işleyen sonsuz bir döngü yürütür.

public override void Run()
{
    CloudQueueMessage msg = null;

    while (true)
    {
        try
        {
            msg = this.imagesQueue.GetMessage();
            if (msg != null)
            {
                ProcessQueueMessage(msg);
            }
            else
            {
                System.Threading.Thread.Sleep(1000);
            }
        }
        catch (StorageException e)
        {
            if (msg != null && msg.DequeueCount > 5)
            {
                this.imagesQueue.DeleteMessage(msg);
            }
            System.Threading.Thread.Sleep(5000);
        }
    }
}

Döngünün her yinelemesinden sonra herhangi bir kuyruk iletisi bulunmazsa program bir saniye için uyku moduna geçer. Bunun yapılması çalışan rolünün aşırı CPU süresi ve depolama işlem maliyetleri doğurmasını engeller. Microsoft Müşteri Danışmanlığı Ekibi, bunu eklemeyi unutan, üretime dağıtılan ve tatile giden bir geliştirici hakkında bir hikaye anlatır. Geri döndüklerinde gözetimleri tatilden daha pahalıya patlar.

Bazı durumlarda bir kuyruk iletisinin içeriği işlemede hataya neden olur. Buna zehir iletisi adı verilir ve bir hatayı günlüğe kaydedip döngüyü yeniden başlatırsanız bu iletiyi sonu gelmez bir şekilde işlemeye çalışabilirsiniz. Bu nedenle, yakalama bloğu uygulamanın geçerli iletiyi işlemeyi kaç kez denediğini denetleyen bir if deyimi içerir ve 5’ten fazla kez denediyse ileti kuyruktan silinir.

Bir kuyruk iletisi bulunduğunda ProcessQueueMessage çağrılır.

private void ProcessQueueMessage(CloudQueueMessage msg)
{
    var adId = int.Parse(msg.AsString);
    Ad ad = db.Ads.Find(adId);
    if (ad == null)
    {
        throw new Exception(String.Format("AdId {0} not found, can't create thumbnail", adId.ToString()));
    }

    CloudBlockBlob inputBlob = this.imagesBlobContainer.GetBlockBlobReference(ad.ImageURL);

    string thumbnailName = Path.GetFileNameWithoutExtension(inputBlob.Name) + "thumb.jpg";
    CloudBlockBlob outputBlob = this.imagesBlobContainer.GetBlockBlobReference(thumbnailName);

    using (Stream input = inputBlob.OpenRead())
    using (Stream output = outputBlob.OpenWrite())
    {
        ConvertImageToThumbnailJPG(input, output);
        outputBlob.Properties.ContentType = "image/jpeg";
    }

    ad.ThumbnailURL = outputBlob.Uri.ToString();
    db.SaveChanges();

    this.imagesQueue.DeleteMessage(msg);
}

Bu kod, görüntü URL’sini almak için veritabanını okur, görüntüyü bir küçük resme dönüştürür, küçük resmi bir blob’a kaydeder, veritabanını küçük resim blob URL’si ile güncelleştirir ve kuyruk iletisini siler.

Not

ConvertImageToThumbnailJPG yöntemindeki kod kolaylık için System.Drawing ad alanındaki sınıfları kullanır. Ancak, bu ad alanındaki sınıflar Windows Forms ile kullanılmak üzere tasarlanmıştır. Bir Windows veya ASP.NET hizmetinde kullanılması desteklenmez. Görüntü işleme seçenekleri hakkında daha fazla bilgi için bkz. Dinamik Görüntü Oluşturma ve Görüntü Yeniden Boyutlandırmaya Ayrıntılı Bakış.

Sorun giderme

Bu öğreticideki yönergeleri izlerken bir sorun oluşması durumunda bazı yaygın hatalar ve çözümleri aşağıda verilmiştir.

ServiceRuntime.RoleEnvironmentException

RoleEnvironment Nesnesi, Azure'da bir uygulama çalıştırdığınızda veya Azure İşlem Öykünücüsü'yü kullanarak yerel olarak çalıştırdığınızda Azure tarafından sağlanır. Yerel olarak çalıştırırken bu hatayı alırsanız ContosoAdsCloudService projesini başlangıç projesi olarak ayarladığınızdan emin olun. Bu işlem, projeyi Azure İşlem Öykünücüsü kullanılarak çalıştırılacak şekilde ayarlar.

Uygulamanın Azure RoleEnvironment’ı kullanmasının bir nedeni .cscfg dosyalarına depolanmış bağlantı dizelerinin alınmasıdır; dolayısıyla bu özel durumun başka bir nedeni de eksik bir bağlantı dizesidir. ContosoAdsWeb projesinde hem Bulut hem de Yerel yapılandırmaları için StorageConnectionString ayarını oluşturduğunuzdan ve ContosoAdsWorker projesinde her iki yapılandırma için iki bağlantı dizesini de oluşturduğunuzdan emin olun. StorageConnectionString için çözümün tamamında Tümünü Bul araması yaparsanız 6 dosyada 9 kez görmeniz gerekir.

xxx bağlantı noktası için geçersiz kılınamıyor. Yeni bağlantı noktası http protokolü için izin verilen en düşük 8080 değerinin altında

Web projesi tarafından kullanılan bağlantı noktası numarasını değiştirmeyi deneyin. ContosoAdsWeb projesine sağ tıklayın ve ardından Özellikler öğesine tıklayın. Web sekmesine tıklayın ve ardından Proje Url’si ayarında bağlantı noktası numarasını değiştirin.

Sorunu çözebilecek başka bir alternatif için aşağıdaki bölüme bakın.

Yerel olarak çalışırken oluşan diğer hatalar

Varsayılan olarak yeni bulut hizmeti projeleri, Azure ortamının benzetimini yapmak için Azure İşlem Öykünücüsü express kullanır. Bu, tam işlem öykünücüsünün hafif sürümüdür ve hızlı sürümün çalışmadığı bazı koşullarda tam öykünücü çalışır.

Projeyi tam öykünücü kullanacak şekilde değiştirmek için ContosoAdsCloudService projesine sağ tıklayın ve ardından Özellikler’e tıklayın. Özellikler penceresinde Web sekmesine ve ardından Tam Öykünücü Kullan radyo düğmesine tıklayın.

Uygulamayı tam öykünücü ile çalıştırmak için Visual Studio’yu yönetici ayrıcalıklarıyla açmanız gerekir.

Sonraki adımlar

Contoso Ads uygulaması bir başlangıç öğreticisi için kasıtlı olarak basit tutulmuştur. Örneğin, bağımlılık ekleme veya depo ve iş birimi düzenleri uygulamaz, günlüğe kaydetme arabirimi yoktur, veri modeli değişikliklerini yönetmek için EF Code First Geçişleri veya geçici ağ hatalarını yönetmek için EF Bağlantı Dayanıklılığı kullanmaz, vb.

Daha gerçek kodlama uygulamalarını gösteren bazı bulut hizmeti örnek uygulamaları en az karmaşık olandan en karmaşığa doğru aşağıda listelenmiştir:

Bulut için geliştirme hakkında genel bilgi için bkz. Azure ile Gerçek Bulut Uygulamaları Derleme.

Azure Storage’da en iyi yöntemler ve yaklaşımlar hakkında bir tanıtım için bkz. Microsoft Azure Storage – Yenilikler, En İyi Yöntemler ve Yaklaşımlar.

Daha fazla bilgi için aşağıdaki kaynaklara bakın: