Ek: Düzelt Örnek Uygulaması (Azure ile Cloud Apps Real-World Oluşturma)

tarafından Rick Anderson, Tom Dykstra

Düzelt projesini indirin

Azure e-kitabıyla Gerçek Dünya Bulut Uygulamaları Oluşturma, Scott Guthrie tarafından geliştirilen bir sunuyu temel alır. Bulut için web uygulamalarını başarıyla geliştirmenize yardımcı olabilecek 13 desen ve uygulama açıklanmaktadır. E-kitap hakkında bilgi için ilk bölüme bakın.

Azure ile Gerçek Dünya Cloud Apps Oluşturma e-kitabının bu eki, indirebileceğiniz Düzelt örnek uygulaması hakkında ek bilgi sağlayan aşağıdaki bölümleri içerir:

Bilinen sorunlar

Düzelt uygulaması başlangıçta, bu e-kitapta sunulan bazı desenleri olabildiğince basit bir şekilde göstermek için geliştirilmiştir. Ancak, e-kitap gerçek dünya uygulamaları oluşturmakla ilgili olduğundan, Düzelt kodunu yayımlanan yazılım için yaptığımıza benzer bir gözden geçirme ve test sürecine tabi bıraktık. Bir dizi sorun bulduk ve herhangi bir gerçek dünya uygulamasında olduğu gibi, bazıları düzeltildi ve bazıları daha sonraki bir sürüme erteledik.

Aşağıdaki liste, bir üretim uygulamasında ele alınması gereken sorunları içerir, ancak bir nedenle veya başka bir nedenle Düzelt örnek uygulamasının ilk sürümünde ele alınmamaya karar verdik.

Güvenlik

  • Var olmayan bir sahipe görev atayamamanızı sağlayın.
  • Yalnızca oluşturduğunuz veya size atanan görevleri görüntüleyip değiştirebileceğinizden emin olun.
  • Oturum açma sayfaları ve kimlik doğrulama tanımlama bilgileri için HTTPS kullanın.
  • Kimlik doğrulama tanımlama bilgileri için bir zaman sınırı belirtin.

Giriş doğrulaması

Genel olarak, bir üretim uygulaması Düzelt uygulamasından daha fazla giriş doğrulaması yapar. Örneğin, karşıya yükleme için izin verilen görüntü boyutu / görüntü dosyası boyutu sınırlı olmalıdır.

Yönetici işlevselliği

Bir yönetici mevcut görevlerin sahipliğini değiştirebilmelidir. Örneğin, bir görevi oluşturan kişi şirketten ayrılabilir ve yönetim erişimi etkinleştirilmediği sürece görevi sürdürme yetkisine sahip kimse kalmaz.

Kuyruk iletisi işleme

Düzelt uygulamasında kuyruk iletisi işleme, kuyruk merkezli iş desenini minimum kod miktarıyla göstermek için basit olacak şekilde tasarlanmıştır. Bu basit kod gerçek bir üretim uygulaması için yeterli olmaz.

  • Kod, her kuyruk iletisinin en fazla bir kez işlendiğini garanti etmez. Kuyruktan bir ileti aldığınızda, iletinin diğer kuyruk dinleyicileri tarafından görünmediği bir zaman aşımı süresi vardır. İleti silinmeden önce zaman aşımı süresi dolarsa, ileti yeniden görünür hale gelir. Bu nedenle, bir çalışan rolü örneği bir iletiyi işlemek için uzun zaman harcarsa, teorik olarak aynı iletinin iki kez işlenmesi mümkündür ve bu da veritabanında yinelenen bir görevle sonuçlanır. Bu sorun hakkında daha fazla bilgi için bkz. Azure Depolama Kuyruklarını Kullanma.
  • Kuyruk yoklama mantığı, ileti alma toplu işlemiyle daha uygun maliyetli olabilir. CloudQueue.GetMessageAsync'i her çağırdığınızda bir işlem maliyeti olur. Bunun yerine, tek bir işlemde birden çok ileti alan CloudQueue.GetMessagesAsync'i çağırabilirsiniz (çoğul 'lar'ı not edin). Azure Depolama Kuyrukları için işlem maliyetleri çok düşük olduğundan çoğu senaryoda maliyetler üzerindeki etkisi önemli değildir.
  • Kuyruk ileti işleme kodundaki sıkı döngü, çok çekirdekli VM'leri verimli bir şekilde kullanmayan CPU benzenşiminin oluşmasına neden olur. Daha iyi bir tasarım, birkaç zaman uyumsuz görevi paralel olarak çalıştırmak için görev paralelliğini kullanır.
  • Kuyruk iletisi işleme yalnızca temel özel durum işlemeye sahiptir. Örneğin kod, zehirli iletileri işlemez. (İleti işleme bir özel duruma neden olduğunda, hatayı günlüğe kaydetmeniz ve iletiyi silmeniz gerekir, aksi takdirde çalışan rolü bunu yeniden işlemeyi dener ve döngü süresiz olarak devam eder.)

SQL sorguları sınırsız

Geçerli Düzelt Kod, Dizin sayfaları için sorguların döndürebileceği satır sayısıyla ilgili bir sınır getirmeyebilir. Veritabanına büyük miktarda görev girilirse, elde edilen listelerin boyutu performans sorunlarına neden olabilir. Çözüm, disk belleği uygulamaktır. Örnek için bkz . ASP.NET MVC Uygulamasında Entity Framework ile Sıralama, Filtreleme ve Sayfalama.

Düzelt uygulaması, denetleyici ile görünüm arasında bilgi geçirmek için FixItTask varlık sınıfını kullanır. En iyi yöntem görünüm modellerini kullanmaktır. Etki alanı modeli (ör. FixItTask varlık sınıfı), veri kalıcılığı için gerekenler etrafında tasarlanırken, bir görünüm modeli veri sunumu için tasarlanabilir.

Düzelt uygulaması, karşıya yüklenen görüntüleri genel olarak depolar, yani URL'yi bulan herkes resimlere erişebilir. Görüntülerin güvenliği genel yerine sağlanabilir.

Kuyruklar için PowerShell otomasyon betikleri yok

Örnek PowerShell otomasyon betikleri yalnızca Tamamen Azure App Service Web Apps'de çalışan Fix It'nin temel sürümü için yazılmıştır. Web uygulamasını ayarlamak ve web uygulamasına dağıtmak için betikler ve kuyruk işleme için gereken Bulut Hizmeti ortamı sağlamadık.

Kullanıcı girişinde HTML kodları için özel işleme

ASP.NET, kötü amaçlı kullanıcıların kullanıcı giriş metin kutularına betik girerek siteler arası betik saldırıları denemesi için birçok yolu otomatik olarak engeller. Ayrıca, görev başlıklarını ve notlarını görüntülemek için kullanılan MVC DisplayFor yardımcısı, tarayıcıya gönderdiği değerleri otomatik olarak HTML ile kodlar. Ancak bir üretim uygulamasında ek önlemler almak isteyebilirsiniz. Daha fazla bilgi için bkz. ASP.NET'da Doğrulama İsteği.

En iyi yöntemler

Aşağıdakiler, Düzelt uygulamasının özgün sürümünün kod gözden geçirmesi ve testinde keşfedildikten sonra düzeltilen bazı sorunlardır. Bazıları özgün kodlayıcının belirli bir en iyi uygulamadan haberdar olmamasından, bazılarının ise kodun hızlı yazılmasından ve yayınlanan yazılım için tasarlanmamasından kaynaklandı. Bu incelemeden ve testten öğrendiğimiz ve web uygulamaları geliştiren diğer kişiler için yararlı olabilecek bir şey olması durumunda sorunları burada listeleyeceğiz.

Veritabanı deposunu at

sınıfı Entity FixItTaskRepository Framework DbContext örneğini atmalıdır. Bunu, sınıfında uygulayarak IDisposableFixItTaskRepository yaptık:

public class FixItTaskRepository : IFixItTaskRepository, IDisposable
{
    private MyFixItContext db = new MyFixItContext();

    // other code not shown

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // Free managed resources.
            if (db != null)
            {
                db.Dispose();
                db = null;
            }
        }
    }
}

AutoFac'in örneği otomatik olarak atacağını FixItTaskRepository , bu nedenle açıkça atmamıza gerek olmadığını unutmayın.

Bir diğer seçenek de üye değişkenini DbContext öğesinden FixItTaskRepositorykaldırmak ve bunun yerine bir deyiminin içinde her depo yönteminde yerel DbContext bir using değişken oluşturmaktır. Örnek:

// Alternate way to dispose the DbContext
using (var db = new MyFixItContext())
{
    fixItTask = await db.FixItTasks.FindAsync(id);
}

DI ile tekilleri bu şekilde kaydetme

Sınıfın ve Logger sınıfın yalnızca bir örneği gerektiğindenPhotoService, bu sınıfların DependenciesConfig.cs dosyasında bağımlılık ekleme için tek örnek olarak kaydedilmesi gerekir:

builder.RegisterType<Logger>().As<ILogger>().SingleInstance();
builder.RegisterType<FixItTaskRepository>().As<IFixItTaskRepository>();
builder.RegisterType<PhotoService>().As<IPhotoService>().SingleInstance();

Güvenlik: Hata ayrıntılarını kullanıcılara gösterme

Özgün Düzelt uygulamasının genel bir hata sayfası yoktu ve yalnızca tüm özel durumların kullanıcı arabiriminde kabarmasına izin verdi, bu nedenle veritabanı bağlantı hataları gibi bazı özel durumlar tarayıcıda tam yığın izlemesinin görüntülenmesine neden olabilir. Ayrıntılı hata bilgileri bazen kötü amaçlı kullanıcıların saldırılarını kolaylaştırabilir. Çözüm, özel durum ayrıntılarını günlüğe kaydetmek ve kullanıcıya hata ayrıntılarını içermeyen bir hata sayfası görüntülemektir. Düzelt uygulaması zaten günlüğe günlük kaydı yapıyordu ve hata sayfasını görüntülemek için Web.config dosyasına ekledik <customErrors mode=On> .

<system.web>
  <customErrors mode="On"/>
  <authentication mode="None" />
  <compilation debug="true" targetFramework="4.5" />
  <httpRuntime targetFramework="4.5" />
</system.web>

Varsayılan olarak bu, hatalar için Views\Shared\Error.cshtml dosyasının görüntülenmesine neden olur. Error.cshtml dosyasını özelleştirebilir veya kendi hata sayfası görünümünüzü oluşturup bir defaultRedirect öznitelik ekleyebilirsiniz. Belirli hatalar için farklı hata sayfaları da belirtebilirsiniz.

Güvenlik: Bir görevin yalnızca oluşturucusu tarafından düzenlenmesine izin ver

Pano Dizini sayfası yalnızca oturum açmış kullanıcı tarafından oluşturulan görevleri gösterir, ancak kötü amaçlı bir kullanıcı başka bir kullanıcının görevinin kimliğine sahip bir URL oluşturabilir. Bu durumda 404 döndürmek için DashboardController.cs dosyasına kod ekledik:

public async Task<ActionResult> Edit(int id)
{
    FixItTask fixittask = await fixItRepository.FindTaskByIdAsync(id);
    if (fixittask == null)
    {
        return HttpNotFound();
    }

    // Verify logged in user owns this FixIt task.
    if (User.Identity.Name != fixittask.Owner)
    {
       return HttpNotFound();
    }

    return View(fixittask);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(int id, [Bind(Include = "CreatedBy,Owner,Title,Notes,PhotoUrl,IsDone")]FormCollection form)
{
    FixItTask fixittask = await fixItRepository.FindTaskByIdAsync(id);

    // Verify logged in user owns this FixIt task.
    if (User.Identity.Name != fixittask.Owner)
    {
       return HttpNotFound();
    }

    if (TryUpdateModel(fixittask, form))
    {
        await fixItRepository.UpdateAsync(fixittask);
        return RedirectToAction("Index");
    }

    return View(fixittask);
}

Özel durumları yutma

Özgün Düzelt uygulaması, SQL sorgusundan kaynaklanan bir özel durumu günlüğe kaydettikten sonra null döndürdü:

catch (Exception e)
{
    log.Error(e, "Error in FixItTaskRepository.FindTasksByOwnerAsync(userName={0})", userName);
    return null;
}

Bu, kullanıcıya sorgu başarılı olmuş ama yalnızca satır döndürmemiş gibi görünmesini sağlar. Çözüm, yakalama ve günlüğe kaydetme sonrasında özel durumu yeniden oluşturmaktır:

catch (Exception e)
{
    log.Error(e, "Error in FixItTaskRepository.FindTasksByCreatorAsync(creater={0})", creator);
    throw;
}

Çalışan rollerindeki tüm özel durumları yakalama

Çalışan rolündeki işlenmeyen özel durumlar VM'nin geri dönüştürülmesine neden olur, bu nedenle bir try-catch bloğunda yaptığınız her şeyi sarmalamak ve tüm özel durumları işlemek istersiniz.

Varlık sınıflarındaki dize özellikleri için uzunluğu belirtme

Basit kodu görüntülemek için, Düzelt uygulamasının özgün sürümü FixItTask varlığının alanları için uzunluk belirtmedi ve sonuç olarak bunlar veritabanında varchar(max) olarak tanımlandı. Sonuç olarak, kullanıcı arabirimi neredeyse her miktarda girişi kabul eder. Uzunlukların belirtilmesi, hem web sayfasındaki kullanıcı girişine hem de veritabanındaki sütun boyutuna uygulanan sınırları ayarlar:

public class FixItTask
{
    public int FixItTaskId  { get; set; }
    [StringLength(80)]
    public string CreatedBy { get; set; }
    [Required]
    [StringLength(80)]
    public string Owner { get; set; }
    [Required]
    [StringLength(80)]
    public string Title { get; set; }
    [StringLength(1000)]
    public string Notes { get; set; }
    [StringLength(200)]
    public string PhotoUrl { get; set; }
    public bool IsDone      { get; set; }  
}

Değişmeleri beklenmiyorsa özel üyeleri salt okunur olarak işaretleme

Örneğin sınıfında DashboardController bir örneği FixItTaskRepository oluşturulur ve değiştirilmesi beklenmez, bu nedenle bunu salt okunur olarak tanımladık.

public class DashboardController : Controller
    {
        private readonly IFixItTaskRepository fixItRepository = null;

Listeyi kullan'a tıklayın. Liste yerine Any() kullanın. Count() > 0

Tek umursadığınız listedeki bir veya daha fazla öğenin belirtilen ölçütlere uygun olup olmadığıysa , ölçütlere uyan bir öğe bulunduğunda döndürdüğü için Herhangi bir yöntemi kullanın, ancak yöntemin Count her zaman her öğeyi yinelemesi gerekir. Dashboard Index.cshtml dosyasında başlangıçta şu kod vardı:

@if (Model.Count() == 0) {
    <br />
    <div>You don't have anything currently assigned to you!!!</div>
}

Bunu şu şekilde değiştirdik:

@if (!Model.Any()) {
    <br />
    <div>You don't have anything currently assigned to you!!!</div>
}

MVC yardımcılarını kullanarak MVC görünümlerinde URL oluşturma

Giriş sayfasındaki Düzelt düğmesi için Düzelt uygulaması sabit kodlanmış bir tutturucu öğesidir:

<a href="/Tasks/Create" class="btn btn-primary btn-large">Create a New FixIt &raquo;</a>

Bunun gibi Görünüm/Eylem bağlantıları için Url.Action HTML yardımcısını kullanmak daha iyidir, örneğin:

@Url.Action("Create","Tasks")

Çalışan rolünde Thread.Sleep yerine Task.Delay kullanın

Yeni proje şablonu bir çalışan rolü için örnek kodu ekler Thread.Sleep , ancak iş parçacığının uyku moduna neden olması iş parçacığı havuzunun ek gereksiz iş parçacıkları oluşturmasına neden olabilir. Bunun yerine Task.Delay komutunu kullanarak bunu önleyebilirsiniz.

while (true)
{
    try
    {
        await queueManager.ProcessMessagesAsync();
    }
    catch (Exception ex)
    {
        logger.Error(ex, "Exception in worker role Run loop.");
    }
    await Task.Delay(1000);
}

Zaman uyumsuz geçersiz kılmayı önleyin

Zaman uyumsuz bir yöntemin değer döndürmesi gerekmiyorsa, yerine voidbir Task tür döndürür.

Bu örnek sınıfındandır FixItQueueManager :

// Correct
public async Task SendMessageAsync(FixItTask fixIt) { ... }

// Incorrect
public async void SendMessageAsync(FixItTask fixIt) { ... }

Yalnızca üst düzey olay işleyicileri için kullanmalısınız async void . Bir yöntemi olarak async voidtanımlarsanız, çağıran yöntemi bekleyemez veya yöntemin attığı özel durumları yakalayamaz. Daha fazla bilgi için bkz. Zaman Uyumsuz Programlamada En İyi Yöntemler.

Çalışan rolü döngüsünden ayrılmak için iptal belirteci kullanma

Genellikle bir çalışan rolündeki Run yöntemi sonsuz bir döngü içerir. Çalışan rolü durdurulduğunda RoleEntryPoint.OnStop yöntemi çağrılır. Run yöntemi içinde yapılan işi iptal etmek ve düzgün bir şekilde çıkmak için bu yöntemi kullanmalısınız. Aksi takdirde, işlem bir işlemin ortasında sonlandırılabilir.

Otomatik MIME Algılama Yordamını geri çevirme

Bazı durumlarda, Internet Explorer web sunucusu tarafından belirtilen türden farklı bir MIME türü bildirir. Örneğin, Internet Explorer HTTP yanıt üst bilgisi Content-Type: text/plain ile teslim edilen bir dosyada HTML içeriği bulursa, Internet Explorer içeriğin HTML olarak işlenmesi gerektiğini belirler. Ne yazık ki, bu "MIME algılama" güvenilmeyen içeriği barındıran sunucularda da güvenlik sorunlarına yol açabilir. Bu sorunla mücadele etmek için Internet Explorer 8, MIME türü belirleme kodunda bir dizi değişiklik yaptı ve uygulama geliştiricilerinin MIME algılamayı geri çevirmesine olanak tanır. aşağıdaki kod Web.config dosyasına eklendi.

<system.webServer>
     <httpProtocol>
        <customHeaders>
           <add name="X-Content-Type-Options" value="nosniff"/>
        </customHeaders>
     </httpProtocol>
     <modules>
      <remove name="FormsAuthenticationModule" />
    </modules>
  </system.webServer>

Paketlemeyi ve küçültmeyi etkinleştirme

Visual Studio yeni bir web projesi oluşturduğunda, JavaScript dosyalarını paketleme ve küçültme varsayılan olarak etkin değildir. BundleConfig.cs dosyasına bir kod satırı ekledik:

// For more information on bundling, visit https://go.microsoft.com/fwlink/?LinkId=301862
public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-{version}.js"));
 
   // Code removed for brevity/
 
   BundleTable.EnableOptimizations = true;
}

Kimlik doğrulama tanımlama bilgileri için süre sonu zaman aşımı ayarlama

Varsayılan olarak, kimlik doğrulama tanımlama bilgilerinin süresi iki hafta içinde dolar. Daha kısa bir süre daha güvenlidir. Bu ayarı StartupAuth.cs dosyasında değiştirebilirsiniz:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    ExpireTimeSpan = System.TimeSpan.FromMinutes(20)
});

Uygulamayı yerel bilgisayarınızda Visual Studio'dan çalıştırma

Düzelt uygulamasını çalıştırmanın iki yolu vardır:

  • Yeni görevleri doğrudan SQL veritabanına yazan temel uygulamayı çalıştırın.
  • Görev oluşturmak için kuyruk ve arka uç hizmeti kullanarak uygulamayı çalıştırın. Kuyruk düzeni , Kuyruk Merkezli İş Düzeni bölümünde açıklanmıştır.

Temel uygulamayı çalıştırma

  1. Visual Studio 2017'yi yükleyin.
  2. Visual Studio için .NET için Azure SDK'sını yükleyin.
  3. MSDN Kod Galerisi'nden .zip dosyasını indirin.
  4. Dosya Gezgini'da, .zip dosyasına sağ tıklayın ve Özellikler'e tıklayın, ardından Özellikler penceresi Engellemeyi Kaldır'a tıklayın.
  5. Dosyanın sıkıştırmasını açın.
  6. Visual Studio'yu başlatmak için .sln dosyasına çift tıklayın.
  7. Araçlar menüsünde NuGet Paket Yöneticisi'ne ve ardından Paket Yöneticisi Konsolu'na tıklayın.
  8. Paket Yöneticisi Konsolu'nda (PMC), Geri Yükle'ye tıklayın.
  9. Visual Studio'dan çıkın.
  10. Azure Depolama Öykünücüsü'ne başlayın.
  11. Önceki adımda kapatmış olduğunuz çözüm dosyasını açarak Visual Studio'yu yeniden başlatın.
  12. FixIt projesinin başlangıç projesi olarak ayarlandığından emin olun ve projeyi çalıştırmak için CTRL+F5 tuşlarına basın.

Uygulamayı kuyruk işleme ile çalıştırma

  1. Temel uygulamayı çalıştırma yönergelerini izleyin ve ardından tarayıcıyı kapatın ve Visual Studio'yu kapatın.

  2. Visual Studio'yu yönetici ayrıcalıklarıyla başlatın. (Azure İşlem Öykünücüsü'ne sahip olacaksınız ve bu, yönetici ayrıcalıkları gerektirir.)

  3. MyFixIt projesindeki (web projesi) uygulama Web.config dosyasında değerini appSettings/UseQueues "true" olarak değiştirin:

    <appSettings>
        <!-- Other settings not shown -->
        <add key="UseQueues" value="true"/>
    </appSettings>
    
  4. Azure Depolama Öykünücüsü hala çalışmıyorsa yeniden başlatın.

  5. FixIt web projesini ve MyFixItCloudService projesini aynı anda çalıştırın.

    Visual Studio'yu kullanma:

    1. FixIt projesini çalıştırmak için F5 tuşuna basın.
    2. Çözüm Gezgini'da MyFixItCloudService projesine sağ tıklayın ve ardındanYeni Örnek Başlat'taHata Ayıkla'ya> tıklayın.

    Web için Visual Studio 2013 Express'i kullanma:

    1. Çözüm Gezgini'da FixIt çözümüne sağ tıklayın ve Özellikler'i seçin.

    2. Birden Çok Başlangıç Projesi'ne tıklayın.

    3. MyFixIt ve MyFixItCloudService altındaki Eylem açılan listesinde Başlat'ı seçin.

    4. Tamam'a tıklayın.

    5. Her iki projeyi de çalıştırmak için F5'e basın.

      MyFixItCloudService projesini çalıştırdığınızda Visual Studio, Azure İşlem Öykünücüsü'ne başlar. Güvenlik duvarı yapılandırmanıza bağlı olarak, öykünücüye güvenlik duvarı üzerinden izin vermeniz gerekebilir.

Windows PowerShell betiklerini kullanarak temel uygulamayı Azure App Service Web Apps'a dağıtma

Her Şeyi Otomatikleştir desenini göstermek için, Düzelt uygulaması Azure'da bir ortam ayarlayıp projeyi yeni ortama dağıtan betiklerle birlikte sağlanır. Aşağıdaki yönergelerde betiklerin nasıl kullanılacağı açıklanmaktadır.

Azure'da kuyruk kullanmadan çalıştırmak istiyorsanız ve kuyruklarla yerel olarak çalıştırılacak değişiklikleri yaptıysanız, aşağıdaki yönergelere geçmeden önce UseQueues appSetting değerini false olarak ayarladığınızdan emin olun.

Bu yönergelerde, Düzelt çözümünü yerel olarak indirip çalıştırdığınız ve bir Azure hesabınız veya yönetme yetkiniz olan bir Azure aboneliğiniz olduğu varsayılır.

  1. Azure PowerShell konsolunu yükleyin. Yönergeler için bkz. Azure PowerShell yükleme ve yapılandırma.

    Bu özelleştirilmiş konsol, Azure aboneliğinizle çalışacak şekilde yapılandırılmıştır. Azure modülü Program Files dizinine yüklenir ve Azure PowerShell konsolunun her kullanımında otomatik olarak içeri aktarılır.

    Windows PowerShell ISE gibi farklı bir konak programında çalışmayı tercih ediyorsanız, Azure modülünü içeri aktarmak için Import-Module cmdlet'ini kullandığınızdan emin olun veya modülün otomatik içeri aktarılmasını tetikleme amacıyla Azure modülündeki bir komutu kullanın.

  2. Yönetici olarak çalıştır seçeneğiyle Azure PowerShell başlatın.

  3. Azure PowerShell yürütme ilkesini olarak ayarlamak için Set-ExecutionPolicy cmdlet'ini RemoteSignedçalıştırın. İlke değişikliğini tamamlamak için Y (Evet için) girin.

    PS C:\> Set-ExecutionPolicy RemoteSigned
    

    Bu ayar dijital olarak imzalanmayan yerel betikleri çalıştırmanızı sağlar. (Yürütme ilkesini Unrestrictedolarak da ayarlayabilirsiniz. Bu, daha sonra engeli kaldırma adımı gereksinimini ortadan kaldırır, ancak güvenlik nedeniyle bu önerilmez.)

  4. PowerShell'i Add-AzureAccount hesabınızın kimlik bilgileriyle ayarlamak için cmdlet'ini çalıştırın.

    PS C:\> Add-AzureAccount
    

    Bu kimlik bilgilerinin süresi bir süre sonra dolar ve cmdlet'i Add-AzureAccount yeniden çalıştırmanız gerekir. Bu e-kitap yazıldığı için kimlik bilgilerinin süresi dolmadan önce geçmesi gereken süre 12 saattir.

  5. Birden çok aboneliğiniz varsa, test ortamını oluşturmak istediğiniz aboneliği belirtmek için Select-AzureSubscription cmdlet'ini kullanın.

  6. ve Import-AzurePublishSettingsFile cmdlet'lerini kullanarak Get-AzurePublishSettingsFile aynı Azure aboneliği için bir yönetim sertifikası içeri aktarın. Bu cmdlet'lerin ilki bir sertifika dosyası indirir ve ikincisinde dosyayı içeri aktarmak için dosyanın konumunu belirtirsiniz. > [! ÖNEMLİ]

    azure hizmetlerinizi yönetmek için kullanılabilecek bir sertifika içerdiğinden, indirilen dosyayı güvenli bir konumda tutun veya bitirdiğinizde silin.

    PS C:\Users\username\Documents\Visual Studio 2013\Projects\MyFixIt\Automation> Get-AzurePublishSettingsFile
    PS C:\Users\username\Documents\Visual Studio 2013\Projects\MyFixIt\Automation> Import-AzurePublishSettingsFile "C:\Users
    \username\Downloads\Azure MSDN - Visual Studio Ultimate-12-14-2013-credentials.publishsettings"
    

    Sertifika, SQL Veritabanı sunucusunda güvenlik duvarı kuralı ayarlamak için geliştirme makinesinin IP adresini algılayan bir REST API çağrısı için kullanılır.

  7. Betikleri içeren dizine gitmek için Set-Location cmdlet'ini (diğer adlar cd, chdirve sl) çalıştırın. (Düzelt çözüm klasöründeki Otomasyon klasöründe bulunurlar.) Dizin adlarından herhangi biri boşluk içeriyorsa yolu tırnak içine alın. Örneğin, dizine gitmek için c:\Sample Apps\FixIt\Automation aşağıdaki komutu girebilirsiniz:

    PS C:\> cd "c:\Sample Apps\MyFixIt\Automation"
    
  8. Windows PowerShell bu betikleri çalıştırmasına izin vermek için Unblock-File cmdlet'ini kullanın. (Betikler İnternet'ten indirildiği için engellenir.)

    Uyarı

    Güvenlik - Herhangi bir betik veya yürütülebilir dosya üzerinde çalıştırmadan Unblock-File önce dosyayı Not Defteri'nde açın, komutları inceleyin ve kötü amaçlı kod içermediklerini doğrulayın.

    Örneğin, aşağıdaki komut cmdlet'ini Unblock-File geçerli dizindeki tüm betiklerde çalıştırır.

    PS C:\Sample Apps\FixIt\Automation> Unblock-File -Path .\*.ps1
    
  9. Temel (kuyruk işleme yok) Fix It uygulaması için web uygulaması oluşturmak için ortam oluşturma betiğini çalıştırın.

    Gerekli Name parametre veritabanının adını belirtir ve betiğin oluşturduğu depolama hesabı için de kullanılır. Ad, azurewebsites.net etki alanında genel olarak benzersiz olmalıdır. Fixit veya Test gibi benzersiz olmayan bir ad belirtirseniz (hatta örnekte olduğu gibi fixitdemo), New-AzureWebsite cmdlet çakışmayı bildiren bir İç Hata ile başarısız olur. Betik, web uygulamalarının, depolama hesaplarının ve veritabanlarının ad gereksinimlerine uymak için adı tüm küçük harflere dönüştürür.

    Gerekli SqlDatabasePassword parametre, SQL Veritabanı için oluşturulacak yönetici hesabının parolasını belirtir. Parolaya özel XML karakterleri eklemeyin (& <> ;). Bu, Betiklerin yazılma biçiminin bir sınırlamasıdır, Azure'ın bir sınırlaması değildir.

    Örneğin, "fixitdemo" adlı bir web uygulaması oluşturmak ve "Passw0rd1" SQL Server yönetici parolası kullanmak istiyorsanız, aşağıdaki komutu girebilirsiniz:

    PS C:\Sample Apps\FixIt\Automation> .\New-AzureWebsiteEnv.ps1 -Name 
    fixitdemo <required params here>
    

    Adın azurewebsites.net etki alanında benzersiz olması ve parolanın parola karmaşıklığı için SQL Veritabanı gereksinimlerini karşılaması gerekir. (Örnek Passw0rd1 gereksinimleri karşılar.)

    Komutun "." ile başladığını unutmayın. Betiklerin kötü amaçlı yürütülmesini önlemeye yardımcı olmak için, Windows PowerShell bir betik çalıştırdığınızda betik dosyasının tam yolunu sağlamanız gerekir. Geçerli dizini (".") belirtmek veya tam yolu sağlamak için nokta kullanabilirsiniz, örneğin:

    PS C:\Temp\FixIt\Automation> C:\Temp\FixIt\Automation\New-AzureWebsiteEnv.ps1 -Name fixitdemo -SqlDatabasePassword Pas$w0rd
    

    Betik hakkında daha fazla bilgi için cmdlet'ini Get-Help kullanın.

    PS C:\Sample Apps\FixIt\Automation> Get-Help -Full .\New-AzureWebsiteEnv.ps1
    

    Döndürülen yardımı filtrelemek için Get-Help cmdlet'in , Full, Parametersve Examples parametrelerini kullanabilirsinizDetailed.

    Betik başarısız olursa veya "New-AzureWebsite : Çağrı Set-AzureSubscription ve önce Select-AzureSubscription" gibi hatalar oluşturursa, Azure PowerShell yapılandırmasını tamamlamamış olabilirsiniz.

    Betik tamamlandıktan sonra, Her Şeyi Otomatikleştirme bölümünde gösterildiği gibi oluşturulan kaynakları görmek için Azure Yönetim Portalı'nı kullanabilirsiniz.

  10. FixIt projesini yeni Azure ortamına dağıtmak için AzureWebsite.ps1 betiğini kullanın. Örnek:

    PS C:\Sample Apps\FixIt\Automation> .\Publish-AzureWebsite.ps1 ..\MyFixIt\MyFixIt.csproj -Launch
    

    Dağıtım tamamlandığında tarayıcı, Azure'da çalıştırılan Düzelt seçeneğiyle açılır.

Windows PowerShell betiklerinin sorunlarını giderme

Bu betikler çalıştırılırken karşılaşılan en yaygın hatalar izinlerle ilgilidir. ve Import-AzurePublishSettingsFile seçeneğinin başarılı olduğundan Add-AzureAccount ve bunları aynı Azure aboneliği için kullandığınızdan emin olun. Başarılı olsa Add-AzureAccount bile yeniden çalıştırmanız gerekebilir. tarafından Add-AzureAccount eklenen izinlerin süresi 12 saat içinde dolar.

Nesne başvurusu bir nesnenin örneğine ayarlı değil.

Betik "Nesne başvurusu bir nesnenin örneğine ayarlanmadı" gibi hatalar döndürürse, yani Windows PowerShell işlenmek üzere bir nesne bulamıyorsa (bu bir null başvuru özel durumudur), cmdlet'ini Add-AzureAccount çalıştırın ve betiği yeniden deneyin.

New-AzureSqlDatabaseServer : Object reference not set to an instance of an object.
At C:\ps-test\azure-powershell-samples-master\WebSite\create-azure-sql.ps1:80 char:19
+ $databaseServer = New-AzureSqlDatabaseServer -AdministratorLogin $UserName -Admi ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [New-AzureSqlDatabaseServer], NullReferenceException
    + FullyQualifiedErrorId : 
Microsoft.WindowsAzure.Commands.SqlDatabase.Server.Cmdlet.NewAzureSqlDatabaseServer

InternalError: Sunucu bir iç hatayla karşılaştı.

ad New-AzureWebsite azurewebsites.net etki alanında benzersiz olmadığında cmdlet bir iç hata döndürür. Hatayı çözmek için ad içinNew-AzureWebsiteEnv.ps1Name parametresinde bulunan farklı bir değer kullanın.

New-AzureWebsite : InternalError: The server encountered an internal error. 
Please retry the request.
At line:1 char:1
+ New-AzureWebsite -Name fixitdemo
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          
: CloseError: (:) [New-AzureWebsite], Exception
+ FullyQualifiedErrorId : 
Microsoft.WindowsAzure.Commands.Websites.NewAzureWebsiteCommand

Betiği yeniden başlatma

"Betik tamamlandı" iletisini yazdırmadan önce başarısız olduğu için New-AzureWebsiteEnv.ps1 betiğini yeniden başlatmanız gerekiyorsa, betiğin durdurulmadan önce oluşturduğu kaynakları silmek isteyebilirsiniz. Örneğin, betik ContosoFixItDemo web uygulamasını zaten oluşturduysa ve betiği aynı adla yeniden çalıştırırsanız, ad kullanımda olduğundan betik başarısız olur.

Betiğin durdurulmadan önce hangi kaynakları oluşturduğunu belirlemek için aşağıdaki cmdlet'leri kullanın:

  • Get-AzureWebsite
  • Get-AzureSqlDatabaseServer
  • Get-AzureSqlDatabase: Bu cmdlet'i çalıştırmak için veritabanı sunucusu adını öğesine yöneltin Get-AzureSqlDatabase: Get-AzureSqlDatabaseServer | Get-AzureSqlDatabase.

Bu kaynakları silmek için aşağıdaki komutları kullanın. Veritabanı sunucusunu silerseniz, sunucuyla ilişkili veritabanlarını otomatik olarak sileceğinizi unutmayın.

  • Get-AzureWebsite -Name <WebsiteName> | Remove-AzureWebsite
  • Get-AzureSqlDatabase -Name <DatabaseName> -ServerName <DatabaseServerName> | Remove-SqlAzureDatabase
  • Get-AzureSqlDatabaseServer | Remove-AzureSqlDatabaseServer

Kuyruk işleme ile uygulamayı Azure App Service Web Apps ve Azure Bulut Hizmeti'ne dağıtma

Kuyrukları etkinleştirmek için MyFixIt\Web.config dosyasında aşağıdaki değişikliği yapın. altında appSettingsdeğerini UseQueues "true" olarak değiştirin:

<appSettings>
    <!-- Other settings not shown -->
    <add key="UseQueues" value="true"/>
</appSettings>

Ardından MVC uygulamasını daha önce açıklandığı gibi Azure App Service'daki bir web uygulamasına dağıtın.

Ardından yeni bir Azure bulut hizmeti oluşturun. Düzelt uygulamasına dahil edilen betikler bulut hizmetini oluşturmaz veya dağıtmaz, bu nedenle bunun için Azure portal kullanmanız gerekir. Portalda Yeni -- İşlemBulut Hizmeti -- Hızlı Oluşturma'ya tıklayın ve bir URL ve veri merkezi konumu girin. Web uygulamasını dağıttığınız veri merkezini kullanın.

Azure Bulut Hizmeti Portalı'nı ve yeni bir Azure bulut hizmeti projesi oluşturmaya yönelik kullanılabilir seçimlerini içeren birden çok sekmeyi gösteren diyagram

Bulut hizmetini dağıtabilmeniz için önce bazı yapılandırma dosyalarını güncelleştirmeniz gerekir.

MyFixIt.WorkerRole\app.config altında, connectionStringsbağlantı dizesi değerini appdb SQL Veritabanı için gerçek bağlantı dizesi değiştirin. bağlantı dizesi portaldan alabilirsiniz. Portalda, ADO .Net, ODBC, PHP ve JDBC içinSQL Veritabanları - appdb - Görünümü SQL Veritabanı bağlantı dizeleri'ne tıklayın. ADO.NET bağlantı dizesi kopyalayın ve değeri app.config dosyasına yapıştırın. "{your_password_here}" yerine veritabanı parolanızı yazın. (MVC uygulamasını dağıtmak için betikleri kullandığınız varsayıldığında, betik parametresinde SqlDatabasePassword veritabanı parolasını belirttiniz.)

Sonuç aşağıdaki gibi görünmelidir:

<add name="appdb" connectionString="Server=tcp:####.database.windows.net,1433;Database=appdb;User ID=####;Password=####;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" providerName="System.Data.SqlClient" />

Aynı MyFixIt.WorkerRole\app.config dosyasında, altında appSettingsAzure depolama hesabı için iki yer tutucu değeri değiştirin.

<appSettings>
  <add key="StorageAccountName" value="{StorageAccountName}" />
  <add key="StorageAccountAccessKey" value="{StorageAccountAccessKey}" />
</appSettings>

Erişim anahtarını portaldan alabilirsiniz. Bkz. Depolama hesaplarını yönetme.

MyFixItCloudService\ServiceConfiguration.Cloud.cscfg içinde, Azure depolama hesabı için aynı iki yer tutucu değerini değiştirin.

<ConfigurationSettings>
    <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" 
             value="DefaultEndpointsProtocol=https;AccountName={StorageAccountName};AccountKey={StorageAccountAccessKey}" />
  </ConfigurationSettings>

Artık bulut hizmetini dağıtmaya hazırsınız. Çözüm Araştırma'da MyFixItCloudService projesine sağ tıklayın ve Yayımla'yı seçin. Daha fazla bilgi için bu öğreticinin 2. bölümünde yer alan "Uygulamayı Azure'a Dağıtma" bölümüne bakın.