Ek: BT örneğini yapılandırma örnek uygulaması (Azure ile Real-World bulut uygulamaları oluşturma)

, Mike te son, Rick Anderson, Tom Dykstra tarafından

Çözüm projesini indirin

Azure e-book Ile gerçek dünyada bulut uygulamaları oluşturma , Scott Guthrie tarafından geliştirilen bir sunuyu temel alır. Bulut için Web Apps 'i başarılı bir şekilde geliştirmeye yardımcı olabilecek 13 desen ve uygulamaları açıklar. E-kitap hakkında daha fazla bilgi için ilk bölümebakın.

Azure e-Book ile gerçek dünyada bulut uygulamaları oluşturmaya yönelik bu ek, indirebileceğiniz BT örnek uygulaması hakkında ek bilgiler sağlayan aşağıdaki bölümleri içerir:

Bilinen sorunlar

BT BT uygulaması, bu e-kitapta sunulan bazı desenlerin olabildiğince basit olması için ilk olarak geliştirilmiştir. Ancak, e-kitap gerçek dünyada uygulamalar oluşturmaya yönelik olduğundan, BT kodunu, piyasaya çıkarılan yazılım için yaptığımız gibi bir gözden geçirme ve test süreci olarak tabi. Herhangi bir gerçek dünya uygulamasında olduğu gibi birkaç sorun bulduk ve bunlardan bazılarının düzeltilmesi ve bazıları daha sonraki bir sürüme erteliyoruz.

Aşağıdaki liste, bir üretim uygulamasında ele alınmalıdır, ancak bir neden veya başka bir nedenle Düzelt örnek uygulamasının ilk sürümünde ele kurmamaya karar verdiğimiz sorunları içerir.

Güvenlik

  • Bir görevi var olmayan bir sahibe atayamazsınız.
  • Yalnızca sizin oluşturduğunuz veya size atanan görevleri görüntüleyebilmeniz ve değiştirediğ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ı, BT uygulamasından daha fazla giriş doğrulaması yapacağından, bu uygulamayı düzeltir. Örneğin, karşıya yükleme için izin verilen görüntü boyutu/resim dosya boyutu sınırlı olmalıdır.

Yönetici işlevselliği

Yönetici, mevcut görevlerdeki sahipliği değiştirebilmelidir. Örneğin, bir görevin Oluşturucusu şirketten ayrılırken, yönetim erişimi etkinleştirilmediği takdirde görevi sürdürmek için herhangi bir yetkiliyle ayrılmayabilir.

İleti işlemeyi sıraya al

BT BT uygulamasındaki sıra iletisi işleme, en az sayıdaki kodla sıra merkezli iş düzenini göstermek için basit olacak şekilde tasarlanmıştır. Bu basit kod, gerçek bir üretim uygulaması için yeterli değildir.

  • Kod, her kuyruk iletisinin en çok bir kez işleneceğini garanti etmez. Sıradan bir ileti aldığınızda, iletinin diğer kuyruk dinleyicileri tarafından görülemiyorsa 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şlemeye uzun süre harcadıysanız, aynı iletinin iki kez işlenebilmesi için teorik olarak, veritabanında yinelenen bir görevin oluşmasına neden olur. Bu sorun hakkında daha fazla bilgi için bkz. Azure depolama kuyruklarını kullanma.
  • Sıra yoklama mantığı, ileti alımı toplu işlem tarafından daha düşük maliyetli olabilir. Cloudqueue. GetMessageAsyncher çağırdığınızda, işlem maliyeti vardır. Bunun yerine, tek bir işlemde birden çok ileti alan Cloudqueue. GetMessagesAsync (plural ') çağırabilirsiniz. Azure depolama kuyrukları için işlem maliyetleri çok düşüktür, bu nedenle maliyetlerle ilgili etki çoğu senaryoda önemli değildir.
  • Kuyruk ileti işleme kodundaki sıkı döngü, çok çekirdekli VM 'Leri verimli bir şekilde kullanmadan CPU benzeşimi sağlar. Daha iyi bir tasarım, görev paralelliği kullanarak birkaç zaman uyumsuz görevi paralel olarak çalıştırır.
  • Kuyruk ileti işleme yalnızca ilkel özel durum işleme sahiptir. Örneğin, kod, zarar iletileriniişlemez. (İleti işleme bir özel duruma neden olursa, hatayı günlüğe kaydedin ve iletiyi silmeniz ya da çalışan rolü onu tekrar işlemeye çalışır ve döngü süresiz olarak devam eder.)

SQL sorguları sınırsız

Geçerli onarım BT kodu, dizin sayfaları sorgularının kaç satır döndürebileceğini gösteren hiçbir sınır yoktur. Veritabanına büyük bir görev hacmi girilirse, alınan sonuç listelerinin boyutu performans sorunlarına neden olabilir. Çözüm, sayfalama uygulamadır. Bir örnek için, bkz. bir ASP.NET MVC uygulamasındaki Entity Framework sıralama, filtreleme ve sayfalama.

BT BT uygulamasını düzeltme, denetleyici ve görünüm arasında bilgi geçirmek için FixItTask varlık sınıfını kullanır. En iyi uygulama, görüntüleme modellerini kullanmaktır. Etki alanı modeli (örn., FixItTask varlık sınıfı), veri kalıcılığı için gerekli olanlar etrafında tasarlanmıştır, ancak bir görünüm modeli veri sunumu için tasarlanamaz. Daha fazla bilgi için bkz. 12 ASP.NET MVC En Iyi yöntemleri.

BT BT uygulaması, karşıya yüklenen görüntüleri ortak olarak depolar, yani URL 'YI bulan herkesin görüntülere erişebileceği anlamına gelir. Resimler genel yerine güvenli hale getirilmiş olabilir.

Kuyruklar için PowerShell Otomasyonu betikleri yok

Örnek PowerShell Otomasyon betikleri yalnızca Azure App Service Web Apps tamamen çalışan, düzeltilmesi için yalnızca temel sürüm için yazılmıştır. Web uygulamasına kurulum ve dağıtım için kullanılacak betikler ve sıra işleme için gereken bulut hizmeti ortamı için betik 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şi metin kutularına komut dosyası girerek siteler arası komut dosyası saldırıları deneyebileceği birçok yolu otomatik olarak engeller. Ve DisplayFor görev başlıklarını ve notları göstermek için kullanılan MVC Yardımcısı, tarayıcıya gönderdiği değerleri otomatik olarak HTML olarak kodlar. Ancak bir üretim uygulamasında ek ölçüler yapmak isteyebilirsiniz. Daha fazla bilgi için bkz. ASP.net Içinde Istek doğrulaması.

En iyi uygulamalar

Düzeltme BT uygulamasının orijinal sürümünün kod incelemesinin ve test edilmesine sonra düzeltilen bazı sorunlar aşağıda verilmiştir. Özgün kodlayıcı 'ın bazı bir en iyi uygulama farkında olmamasından kaynaklandı, çünkü kod hızla yazıldığı ve piyasaya sürülen yazılım için tasarlanmamıştır. Bu gözden geçirme ve test etme konusunda öğrendiğimiz bir şey, Web uygulamaları geliştirmekte olan başkaları için yararlı olabilecek bir sorun olması durumunda buradaki sorunları listeliyoruz.

Veritabanı deposunu atma

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

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 'ın örneği otomatik olarak atyacağını unutmayın FixItTaskRepository . bu nedenle, açıkça elden atmaya gerek kalmaz.

Diğer bir seçenek de DbContext üye değişkenini öğesinden kaldırmak FixItTaskRepository ve bunun yerine DbContext her bir depo yöntemi içinde bir deyimin içinde yerel bir değişken oluşturmaktır using . Örneğin:

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

Dı ile birlikte tekton Kaydet

Sınıfın ve sınıfın yalnızca bir örneği PhotoService Logger gerekli olduğundan, bu sınıfların DependenciesConfig.cs içinde 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: kullanıcılara hata ayrıntılarını gösterme

Özgün çözüm BT uygulamasının genel bir hata sayfası yoktu ve tüm özel durumların Kullanıcı arabirimine balon oluşturmasını sağlayın, bu nedenle veritabanı bağlantı hataları gibi bazı özel durumlar tarayıcıya bir tam yığın izlemenin görüntülenmesine neden olabilir. Ayrıntılı hata bilgileri, bazı durumlarda kötü amaçlı kullanıcılar tarafından gerçekleştirilen saldırıları 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. BT uygulaması zaten günlüğe kaydediliyor ve bir hata sayfası göstermek için <customErrors mode=On> Web.config dosyasına ekledik.

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

Varsayılan olarak, Views\shared\error.exe hata için görüntülenmesine neden olur. Error. cshtml 'yi özelleştirebilir veya kendi hata sayfası görünümünüzü oluşturabilir ve bir defaultRedirect özniteliği ekleyebilirsiniz. Ayrıca, belirli hatalar için farklı hata sayfaları belirtebilirsiniz.

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

Pano dizini sayfası yalnızca oturum açan kullanıcı tarafından oluşturulan görevleri gösterir, ancak kötü niyetli bir Kullanıcı, başka bir kullanıcının görevine KIMLIĞI olan bir URL oluşturabilir. Bu durumda 404 döndürmek için DashboardController.cs 'e 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 durumlara izin verme

Özgün BT BT uygulaması, bir SQL sorgusundan kaynaklanan bir özel durum günlüğe kaydedildikten sonra null değer döndürdü:

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

Bu, sorguyu başarılı bir şekilde, ancak hiçbir satır döndürmediğiniz şekilde kullanıcıya baktı. Çözüm, yakalama ve günlüğe kaydetme işleminden sonra özel durumu yeniden oluşturmak için:

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

Çalışan rollerinde tüm özel durumları yakala

Bir çalışan rolündeki işlenmemiş özel durumlar, sanal makinenin geri dönüştürülmesine neden olur, böylece bir try-catch bloğunda yaptığınız her şeyi kaydırmak ve tüm özel durumları işlemek istiyorsunuz.

Varlık sınıflarında dize özellikleri için uzunluğu belirtin

Basit kodu göstermek için, Düzeltme BT uygulamasının özgün sürümü, FixItTask varlığının alanları için uzunluk belirtmiyordu ve sonuç olarak veritabanında varchar (max) olarak tanımlanmıştı. Sonuç olarak, Kullanıcı arabirimi neredeyse her türlü girişi kabul eder. Uzunlukları belirtme, hem Web sayfasında hem de veritabanındaki sütun boyutunda bulunan kullanıcı girişine uygulanan limitleri belirler:

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 beklenmediği zaman özel üyeleri ReadOnly olarak işaretle

Örneğin, DashboardController sınıfının bir örneği FixItTaskRepository oluşturulur ve değiştirilmesi beklendiğinden, salt okunurolarak tanımlandık.

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

Liste kullan. Herhangi bir () liste yerine. Count () > 0

Herhangi bir listede bir veya daha fazla öğenin belirtilen ölçütlere uygun olup olmadığı konusunda bilgi alırsanız, her zaman yöntemi kullanın çünkü bu, ölçütlerin her bir öğe Count için her zaman tekrarlarken, metodun her öğe için her zaman yinelemek zorunda olur. Pano dizini. cshtml dosyası başlangıçta bu koda sahipti:

@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ı kullanarak MVC görünümlerinde URL oluşturma

Ana sayfada bir düzelme BT uygulaması oluştur düğmesi Için, BT uygulamasını onarma bir bağlantı öğesini sabit olarak kodlanmış olarak düzeltir:

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

Bu 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, Thread.Sleep bir çalışan rolü için örnek kodu yerleştirir, ancak iş parçacığının uykuya geçmesine neden olan iş parçacığı havuzunun ek gereksiz iş parçacıkları oluşturmasına neden olabilir. Bunun yerine Task. Delay kullanarak bundan kaçınabilirsiniz.

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

Async void kullanmaktan kaçının

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

Bu örnek FixItQueueManager sınıfından olur:

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

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

async voidYalnızca üst düzey olay işleyicileri için kullanmalısınız. Bir yöntemi olarak tanımlarsanız async void , çağıran yöntemi bekler veya yöntemin aldığı özel durumları yakalayabilir. Daha fazla bilgi için bkz. zaman uyumsuz programlamada En Iyi uygulamalar.

Çalışan rolü döngüsünden ayırmak için iptal belirteci kullanın

Genellikle, ç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. Bu yöntemi, Run yöntemi içinde yapılan çalışmayı iptal etmek ve sorunsuz bir şekilde çıkmak için kullanmanız gerekir. Aksi takdirde, işlem bir işlemin ortasında sonlandırılabilir.

Otomatik MIME algılaması yordamının oturumunu kapat

Bazı durumlarda, Internet Explorer, Web sunucusu tarafından belirtilen türden farklı bir MIME türü raporlar. Örneğin, Internet Explorer HTTP yanıt üst bilgisi Içerik-türü: metin/düz olan bir dosyada HTML içeriğini bulursa, içeriğin HTML olarak işlenip işlenmeyeceğini belirler. Ne yazık ki bu "MIME algılaması", güvenilmeyen içeriği barındıran sunucular için güvenlik sorunlarına da yol açabilir. Bu sorunu çözmek için, Internet Explorer 8, MIME türü belirleme kodunda birkaç değişiklik yaptı ve uygulama geliştiricilerinin MIME algılaması'nı geri almasına izin veriyor. Aşağıdaki kod Web.config dosyasına eklenmiştir.

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

Paketlemeyi ve küçültmeye izin

Visual Studio yeni bir Web projesi oluşturduğunda, JavaScript dosyalarını paketleme ve küçültmeye yönelik varsayılan olarak etkin değildir. BundleConfig.cs içinde 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 bir süre sonu zaman aşımı ayarlama

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

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

Yerel bilgisayarınızda Visual Studio 'dan uygulamayı çalıştırma

Çözümü onarma 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örevleri oluşturmak için bir kuyruk ve arka uç hizmeti kullanarak uygulamayı çalıştırın. Sıra stili, bölüm sırası merkezli çalışmadüzeninde 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ükler.
  3. . Zip dosyasını MSDN kod galerisindenindirin.
  4. Dosya Gezgini 'nde. zip dosyasına sağ tıklayın ve Özellikler ' e ve ardından Özellikler penceresi engellemeyi kaldır ' a tıklayın.
  5. Dosyayı sıkıştırmayı 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 konsolunda (PMC) geri yükle ' ye tıklayın.
  9. Visual Studio 'dan çıkın.
  10. Azure depolama öykünücüsünübaşlatın.
  11. Önceki adımda kapattığınız çö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 ardından 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ırmakiçin yönergeleri 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 Işlem öykünücüsü 'nü kullanıyorsunuz ve bu, yönetici ayrıcalıkları gerektirir.)

  3. Myfixıt projesindeki uygulama Web.config dosyasında (Web projesi), 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 eşzamanlı olarak çalıştırın.

    Visual Studio 'Yu kullanarak:

    1. FixIt projesini çalıştırmak için F5 tuşuna basın.
    2. Çözüm Gezgini, myfixitcloudservice projesine sağ tıklayın ve ardından Hata Ayıkla > Yeni örnek Başlat' a tıklayın.

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

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

    2. Birden çok başlangıç projesi seçin.

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

    4. Tamam düğmesine 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 Işlem öykünücüsü ' nü başlatır. Güvenlik Duvarı yapılandırmanıza bağlı olarak, güvenlik duvarı üzerinden öykünücüye izin vermeniz gerekebilir.

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

Her şeyi otomatikleştirin . BT BT uygulaması, Azure 'da bir ortam oluşturan ve projeyi yeni ortama dağıtan betikler ile sağlanır. Aşağıdaki yönergeler betiklerin nasıl kullanılacağını açıklamaktadır.

Azure 'da kuyrukları kullanmadan çalıştırmak istiyorsanız ve kuyruklar ile 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önergeler zaten indirdiğiniz ve BT çözümünü yerel olarak yüklediğinizi ve Azure hesabınız olduğunu veya yönetmek için yetkiniz olan bir Azure aboneliğiniz olduğunu varsayar.

  1. Azure PowerShell konsolunu yükler. Yönergeler için bkz. Azure PowerShell nasıl yüklenir ve yapılandırılır.

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

    Windows PowerShell ISE gibi farklı bir ana bilgisayar 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ı tetiklemek için 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 çalıştırın RemoteSigned . İlke değişikliğini gerçekleştirmek için Y (Evet için) girin.

    PS C:\> Set-ExecutionPolicy RemoteSigned
    

    Bu ayar, dijital olarak imzalanmamış yerel betikleri çalıştırmanızı sağlar. (Yürütme ilkesini ' de ayarlayabilirsiniz Unrestricted , bu da daha sonra engellemeyi kaldır adımının gereksinimini ortadan kaldırır, ancak bu, güvenlik nedenleriyle önerilmez.)

  4. Add-AzureAccountPowerShell 'i 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 doluyor ve cmdlet 'i yeniden çalıştırmanız gerekir Add-AzureAccount . Bu e-kitap yazıldığı için, kimlik bilgilerinin süresinin dolması için geçen zaman sınırı 12 saattir.

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

  6. Get-AzurePublishSettingsFileVe cmdlet 'lerini kullanarak aynı Azure aboneliğine ait bir yönetim sertifikasını içeri aktarın Import-AzurePublishSettingsFile . Bu cmdlet 'lerden ilki bir sertifika dosyasını indirir ve ikinci adımda bu dosyanın yerini içeri aktarmak için belirtirsiniz. > [!IMPORTANT]

    İndirilen dosyayı güvenli bir yerde tutun veya Azure hizmetlerinizi yönetmek için kullanılabilecek bir sertifika içerdiğinden, bununla işiniz bittiğinde 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 bir 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. Set-Location cd chdir Betikleri Içeren dizine gitmek için set-location cmdlet 'ini (diğer adlar,, ve sl ) çalıştırın. (Çözüm çözümü klasöründeki Otomasyon klasöründe bulunur.) 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 'in bu betikleri çalıştırmasına izin vermek için, Engellemeyi kaldır-File cmdlet 'ini kullanın. (Internet 'ten indirilen betikler engellenir.)

    Warning

    Güvenlik- Unblock-File herhangi bir betik veya yürütülebilir dosya üzerinde çalışmadan önce, dosyayı Not defteri 'nde açın, komutları inceleyin ve kötü amaçlı kodlar içermediğini doğrulayın.

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

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

    Gerekli Name parametre, veritabanının adını belirtir ve ayrıca betiğin oluşturduğu depolama hesabı için de kullanılır. Ad, azurewebsites.net etki alanı içinde genel olarak benzersiz olmalıdır. Armadeğer veya test gibi benzersiz olmayan bir ad belirtirseniz (ya da örnek, fixitdemo gibi), New-AzureWebsite cmdlet bir çakışmayı raporlayan Iç hata ile başarısız olur. Betik, Web Apps, depolama hesapları ve veritabanlarının ad gereksinimleriyle uyumlu olması için adı tüm küçük harfe dönüştürür.

    Gerekli SqlDatabasePassword parametre, SQL veritabanı için oluşturulacak yönetici hesabının parolasını belirtir. Parolada özel XML karakterleri eklemeyin ( & < > ;). Bu, betiklerin yazıldığı, Azure 'un sınırlandırılmasıyla sınırlı bir kısıtlamadır.

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

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

    Ad, azurewebsites.net etki alanında benzersiz olmalıdır 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ı olarak yürütülmesini önlemeye yardımcı olmak için, Windows PowerShell bir betiği çalıştırdığınızda betik dosyasının tam yolunu sağlamanızı gerektirir. Geçerli dizini (".) göstermek için bir nokta kullanabilirsiniz. " veya şöyle bir tam yol sağlayın:

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

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

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

    Detailed Full Parameters Examples Döndürülen yardımı filtrelemek için Get-Help cmdlet 'inin,, ve parametrelerini kullanabilirsiniz.

    Komut dosyası başarısız olursa veya "New-AzureWebsite: Call Set-AzureSubscription ve Select-AzureSubscription First" gibi hatalar oluşturursa Azure PowerShell yapılandırmasını tamamlamadıysanız.

    Betik tamamlandıktan sonra, her şeyi otomatikleştirin bölümünde gösterildiği gibi, oluşturulan kaynakları görmek için Azure yönetim portalı kullanabilirsiniz.

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

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

    Dağıtım tamamlandığında, tarayıcı Azure 'da çalışan düzeltmeyle birlikte 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. Add-AzureAccountVe ' Import-AzurePublishSettingsFile nin başarılı olduğundan ve aynı Azure aboneliği için kullandığınızdan emin olun. Başarılı olsa bile, Add-AzureAccount yeniden çalıştırmanız gerekebilir. Tarafından eklenen izinler Add-AzureAccount 12 saat içinde sona erer.

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, Windows PowerShell 'in işlenecek bir nesne bulamadığı (Bu null başvuru özel durumu) anlamına gelir, Add-AzureAccount cmdlet 'ini ç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ı.

New-AzureWebsiteAd, azurewebsites.net etki alanında benzersiz olmadığında cmdlet bir iç hata döndürür. Hatayı gidermek için, ad parametresinde New-AzureWebsiteEnv.ps1 adı için 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

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

Komut dosyasının durdurulmadan önce oluşturduğu kaynakları öğrenmek için aşağıdaki cmdlet 'leri kullanın:

  • Get-AzureWebsite
  • Get-AzureSqlDatabaseServer
  • Get-AzureSqlDatabase: Bu cmdlet 'i çalıştırmak için veritabanı sunucusunun adını şu şekilde kanal Get-AzureSqlDatabase : Get-AzureSqlDatabaseServer | Get-AzureSqlDatabase.

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

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

Azure App Service Web Apps ve Azure bulut hizmeti için kuyruk işleme ile uygulamayı dağıtma

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

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

Daha önceaçıklandığı gıbı, MVC uygulamasını Azure App Service bir Web uygulamasına dağıtın.

Sonra yeni bir Azure bulut hizmeti oluşturun. BT BT uygulamasına dahil olan betikler bulut hizmetini oluşturmaz veya dağıtmaz, bu nedenle Azure portal kullanmanız gerekir. Portalda Yeni -- işlembulut hizmeti -- hızlı oluştur' a tıklayın ve ardından bir URL ve veri merkezi konumu girin. Web uygulamasını dağıttığınız veri merkezini kullanın.

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

MyFixIt.WorkerRole\app.config ' de, connectionStrings appdb bağlantı DIZESININ değerini SQL veritabanı için gerçek bağlantı dizesiyle değiştirin. Bağlantı dizesini portaldan alabilirsiniz. Portalda SQL veritabanları - appdb - Görünüm SQL veritabanı bağlantı dizelerini ADO .net, ODBC, php ve JDBC için seçin. ADO.NET bağlantı dizesini kopyalayın ve değeri app.config dosyasına yapıştırın. "{ _ Parolanız _ buraya}" yerine veritabanınızın parolasını ekleyin. (MVC uygulamasını dağıtmak için betikleri kullandığınız varsayılarak, SqlDatabasePassword komut dosyası parametresinde 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, appSettings Azure depolama hesabı için iki yer tutucu değerini değiştirin.

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

Portaldan erişim anahtarını edinebilirsiniz. Bkz. depolama hesaplarını yönetme.

MyFixItCloudService\ServiceConfiguration.Cloud.cscfg ' de, 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ırırken, MyFixItCloudService projesine sağ tıklayın ve Yayımla' yı seçin. Daha fazla bilgi için, Bu öğreticinin2. bölümünde olan "uygulamayı Azure 'a dağıtma" bölümüne bakın.