Skip to content

.Net 4.7.2 tabanlı bir uygulamalar bütününü Net 5'e taşımak konulu kişisel öğretidir. Malum Net 5, .Net Framework dönemlerinden gelen bazı konuları artık içermiyor/desteklemiyor. WPF, WCF, WWF, .Net Remoting buna örnek olarak verilebilir.Herhalde 2020ler Net 5'in yılları olacak. Bu noktada 2000lerden gelen ve evrilerek .Net 4.8'e kadar çıkan bir…

Notifications You must be signed in to change notification settings

buraksenyurt/migration_sample

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

74 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

.Net 4.7.2 Tabanlı bir Uygulamalar Bütününü Net 5'e Nasıl Taşırız?

Malum Net 5, .Net Framework dönemlerinden gelen bazı konuları artık içermiyor/desteklemiyor. WPF, WCF, WWF, .Net Remoting buna örnek olarak verilebilir.Herhalde 2020ler Net 5'in yılları olacak. Bu noktada 2000lerden gelen ve evrilerek .Net 4.8'e kadar çıkan birçok uygulama olduğunu da ifade etsek yeridir. Dolayısıyla bu çözümleri Net 5'e taşımak isteyebiliriz. Bu pratikte .Net 4.7.2 tabanlı bir solution içeriğini Net 5'e taşımakla ilgili çalışmalar yer alacak.

İki klasörümüz var. Birisi var olan uygulamamız diğeri de Net 5'e çevrilmiş hali.

ClassicGames

.Net Framework 4.7.2'yi merkezine alan Solution. (Özellikle projelerin packages.config, csproj dosya içeriklerini takip edin)

  • ClassicGames.Models: Model sınıfları olan Game ve GameReview tiplerini içerip, Newtonsoft'u referans eden Class Library türevidir.
  • ClassicGames.DAL: Data Access Layer rolünü üstlenen Class Library. Autofac (IoC Container için), Serilog (Loglama için) ve EntityFramework (ORM entegrasyonu için) NuGet paketlerinin .Net Framework 4.7.2 için uyumlu olan sürümlerini kullanıyor. Oyun ve oyun yorumları ile ilgili gerekli CRUD operasyonlarını sağlayan bir kütüphane.
  • ClassicGames.WebClient: Asp.Net MVC 5 tipinden bir web istemcisidir. Repository üstünden oyun ve oyun yorumları ile ilgili operasyonları icra eder. Bunun için ClassicGames.DAL ve ClassicGames.Models projelerini kullanır. Ayrıca, Antlr, Autoface, EntityFramework, Bootstrap gibi Nuget paketleri kullanmaktadır.
  • ClassicGames.Dashboard: WPF tabanlı bir Administrator uygulamasıdır. Yeni bir oyun eklemek, silmek, bilgilerini güncellemek için kullanılan basit bir windows uygulaması olarak düşünülebilir. GamesWindow.xaml üstündeki DataGrid oldukça yeteneklidir. Tuşa hassasiyeti vardır. Del ile kayıt silebilir, çift tıkladığımız hücrelerde anında güncelleme yapabiliriz. Autofac, Entity Framework, Newtonsoft.Json, Serilog nuget paketlerini kullanıyor.

MVC 5 tabanlı web uygulamasına ait birkaç ekran görüntüsü...

Bizi karşılayan boş bir lobi sayfası. screenshot_1.png

Commdore64DBInitializer sınıfı ile ilk etapta eklenen iki oyun bilgisinin gösterildiğin oyunlar sayfası. screenshot_2.png

Bir oyun için detaya gittiğimizde karşımıza çıkmasını beklediğimiz sayfa. screenshot_3.png

Oyunla ilgili değerlendirmelerin toplu olarak görüldüğü sayfa. screenshot_4.png

Bir değerlendirmeyi silmek istediğimizde karşımıza çıkan sevimli sayfa :P screenshot_5.png

WPF Olarak Tasarlanmış Dashboard uygulamasına ait birkaç ekran görüntüsü.

Ana sayfanın iğrenç grid görüntüsü :D screenshot_6.png

Efsane futbol oyununu ekleyip sonrasında kapak fotoğrafını güncellerken... screenshot_7.png

ve bu da bir oyunun JSON çıktısının alınmış hali. screenshot_8.png

Silme operasyonunda da böyle bir durum oluşuyor. screenshot_9.png

Migration İşlemleri

En basiti olan ClassicGames.Models ile işe başlanabilir. Sadece packages.config ve csproj değişiklikleri yeterli olur.

packages.config Migrations

Net 5 tarafındaki paket yönetim tarafı farklıdır. packages.config içeriği csproj içerisinde yer alır. Visual Studio bu noktada bize kolaylık sağlar. packages.config dosyasına sağ tıklayınca çıkan Migrate packages.config to Package Reference ile bu işlem kolayca yapılabilir. Tabii ilgili içeriği elle de taşıyabiliriz. İlk olarak ClassicGames.Models projesi için bu işlemi yapalım. İlgili seçim sonrası çıkan pencerede bağımlılıkları görebiliriz.

screenshot_10.png

Migration başarılı bir şekilde tamamlanınca bir rapor da üretilir. screenshot_11.png

ve bu rapor fiziki olarak klasör içerisine de alınır. Dolayısıyla ortam değişikliği fiziki hafızaya kaydeder. Gerekirse geri alabilelim diye. screenshot_12.png

Migration sonrası projeyi build etmemiz gerekir. csproj'da meydana gelen değişiklik aşağıdaki gibidir. screenshot_13.png

packages.config -> Package Reference düzenlemeleri kullanılan diğer projeler için de uygulanmalıdır

csproj düzenlemesi

Net 5'in csproj dosya içeriği insanlar için daha okunabilir bir hale getirilmiştir. Var olan csproj dosyaları bu açıdan yeniden düzenlenir. Bu işlem için ilk olarak ilgili proje Unload Project seçeneği ile kaldırılır ve sonrasında csproj dosyası Edit Project File seçeneği ile yeniden düzenlenir. Var olan AssemblyInfo.cs dosyasına da ihtiyaç yoktur, silinebilir. csproj'un güncel hali aşağıdaki gibidir.

<Project Sdk="Microsoft.NET.Sdk">	
	<PropertyGroup>
		<TargetFramework>net5.0</TargetFramework>
	</PropertyGroup>	
	<ItemGroup>
		<PackageReference Include="Newtonsoft.Json">
			<Version>12.0.2</Version>
		</PackageReference>
	</ItemGroup>	
	<ItemGroup>
		<Folder Include="Properties\"/>
	</ItemGroup>	
</Project>

ClassicGames.DAL için Dönüşümler

Data Access Layer için kullanılan bu proje ORM tarafı için Entity Framework ve Dependency Injection yönetimi için Autofac kullanmaktadır. Bunların da Net 5 için güncellenmesi gerekir. Entity Framework için Core sürümü tercih edilir ve bu kod tarafında da değişiklik yapılmasını gerektirir. Autofac yerine ise .Net Core ile birlikte hayatımıza gire dahili injection kütüphanesi kullanılabilir. packages.config dönüşümü bize proje bağımlılıklarını da gösterir.

screenshot_14.png

Models projesinde olduğu gibi csproj için de düzenleme yapılır.(Unload Project->Edit Project File->Edit->Reload Project->Build)

<Project Sdk="Microsoft.NET.Sdk">
	<PropertyGroup>
		<TargetFramework>net5.0</TargetFramework>
	</PropertyGroup>
	<ItemGroup>
		<ProjectReference Include="..\ClassicGames.Models\ClassicGames.Models.csproj">
			<Name>ClassicGames.Models</Name>
		</ProjectReference>
	</ItemGroup>
	<ItemGroup>
		<EmbeddedResource Include="Assets\paper_boy.png" />
		<EmbeddedResource Include="Assets\the_last_ninja.jpg" />
	</ItemGroup>
	<ItemGroup>
		<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.4" />
		<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.1" />
		<PackageReference Include="Serilog" Version="2.10.0" />
	</ItemGroup>
</Project>

Bu aşamada build EF Core farklılıkları ve Autofac olmadığından dolayı hatalar verecektir. Yapılan düzenlemeler şöyle özetlenebilir.

  • CommodoreDBContext sınıfı tekrardan düzenlenir ve CommodoreDBInitilaizer içindeki Seed operasyonu buraya alınır. Niteki Core tarafında örnek veri oluşturma prosedürü değişmiştir. HasData metodu kullanılır. CommodoreDBInitilaizer silinir.
  • GameRepository sınıfı yeni DbContext ile uyumlu hale getirilir. (using kullanımlarına dikkat)
  • DI Framework için kullanılan Autofac kaldırıldığı için ClassicGamesDBModule Microsoft.Extensions.DependencyInjection ile çalışacak hale getirilir.

WPF Tarafının Taşınması

WPF halen Net 5 tarafında destekleniyor. Bu nedenle çok acı bir durumda değiliz. İlk olarak packages.config birleştirme işlemini yapmak, AssemblyInfo.cs'ten kurtulmak ve csproj dosyasını uyumlu hale getirmek gerekiyor. Önceki adımlardakine benzer şekilde hareket edilebilir. Konfigurasyon yönetimi artık appsettings.json üzerinden yapıldığı için içerisinde connectionString bilgisini barındıran bir tanesini de eklememiz lazım.

screenshot_15.png

<Project Sdk="Microsoft.NET.Sdk">
	<PropertyGroup>
		<TargetFramework>net5.0-windows</TargetFramework>
		<OutputType>WinExe</OutputType>
		<UseWPF>true</UseWPF>
	</PropertyGroup>
	<ItemGroup>
		<ProjectReference Include="..\ClassicGames.DAL\ClassicGames.DAL.csproj">
			<Name>ClassicGames.DAL</Name>
		</ProjectReference>
		<ProjectReference Include="..\ClassicGames.Models\ClassicGames.Models.csproj">
			<Name>ClassicGames.Models</Name>
		</ProjectReference>
	</ItemGroup>
	<ItemGroup>
		<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.1" />
		<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="5.0.0" />
		<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
		<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
		<PackageReference Include="Serilog" Version="2.10.0" />
	</ItemGroup>
	<ItemGroup>
		<None Update="appsettings.json">
			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
		</None>
	</ItemGroup>
</Project>

Bu işlemlerden sonra Autfac ve EF değişimleri nedeni ile derleme hatası alan App.xaml.cs içeriğini uyumlu hale getirmek gerekiyor.

Web Uygulamasının Taşınması

MVC WebClient uygulamasının .Net 5.0 platformuna evrilmesinin en iyi yolu sıfırdan bir web projesi açıp diğerinden Controller ve View gibi enstrümanları taşımak gibi görünüyor. Bu nedenle önce Solution'daki var olan proje çıkartıldı.(Önceki sürümün yedeğini almıştık zaten) .Net 5.0 destekli yeni bir Asp.Net Core Web Application oluşturuldu. Bu yeni projede yapılanları ise şöyle.

  • Eski projedeki global.asax artık yok. Gerekli Depedency Injection entegrasyonu Startup.cs üstünden yapılır.
  • appSettings.json dosyasına CommodoreDB bağlantısı için gerekli ConnectionStrings bilgisi eklenir.
  • Eski projedeki Controller sınıfları bu projeye de kopyalanır ve MVC 5.0 uyumluluğu için aşağıdaki değişiklikler yapılır.
    • System.Web.Mvc isimalanı Microsoft.AspNetCore.Mvc ile değiştirilir.
    • HttpStatusCodeResult(HttpStatusCode.BadRequest) yerine BadRequestResult kullanılır.
    • HttpNotFound tipi yerine NotFound kullanılır.
    • Bind niteliğine ait Include özelliği kaldırılır.
  • View klasöründeki içerik buraya da taşınır ama bazı değişikliker yapılır.
    • @section Scripts{ kısımları kaldırılır.
    • @Html.HiddenFor'un GameReviews altındaki view'lardaki bazı kullanımları, Hidden fonksiyonu ile değiştirilir.
    • Layout.cshtml sayfasındaki @Scripts ve @Styles direktifleri desteklenmediği için yerlerine script src ve link direktifleri kullanılır.

Bu değişikliklerden sonra WPF ve Web tarafındaki uygulamaların test edilmesi önerilir. Çalışıyorlarsa süper :)

Veritabanının Azure'a Alınması

Sıradaki adımımız SQL veritabanını Azure üzerinden kullanmak. Kişisel Azure hesabımızla bir deneme yapabiliriz. Öncelikle https://shell.azure.com adresine gidilir Bash tipli terminal açılır. Aşağıdaki terminal komutları ile Azure SQL Database oluşturulur.

# İlk iş bir veri merkezini(data center) kullanan resourceGroup oluşturmak
# Önce aşağıdaki gibi resourceGroupName ve location isimli değişkenleri tanımlayalım.
rgName=cgAppResourceGroup
# Bir azure data center seçmemiz gerekiyor. Güncel data center listesini aşağıdaki komutla çekebiliriz
az account list-locations -o table
# Ben germanywestcentral'ı seçtim
location=germanywestcentral
# Artık bu iki değişkeni kullanarak resource group'u oluşturabiliriz.
# shell.Azure'da olduğumuz için Azure CLI aracı olan 'az' den yararlanacağız
az group create --name $rgName --location $location

Buna göre aşağıdakine benzer bir sonuç elde etmeliyiz.,

screenshot_16.png

# SQL Server için username, password ve sunucu adı bilgilerini de bir değişken olarak tanımlayalım
username=scotie
password=t1ger_tanks
serverName=burakselimSQLServer

# Şimdi bu parametreleri kullanarak SQL sunucusunu oluşturalım
az sql server create --name $serverName --resource-group $rgName --location $location --admin-user $username --admin-password $password

Eğer bir sorun çıkmazsa Azure SQL Server başarılı şekilde oluşur.

screenshot_17.png

Sırada firewall için whitelist ayarlamaları var. Kendi IP adresimizi Azure tarafına ekletmemiz lazım. Çalıştığımız bilgisayar IP adresini https://whatismyipaddress.com sitesinden öğrenebiliriz.

# ip değişkenlerimiz
startipAddress=[ip adresiniz]
endipAddress=[ip adresiniz]

# Whitelist'e local IP mizi kaydetmek için aşağıdaki komutla ilerleyelim.
az sql server firewall-rule create --resource-group $rgName --server $serverName -n DeveloperLocalIP --start-ip-address $startipAddress --end-ip-address $endipAddress

# Bu da Azure servisleri için whitelist ayarı
az sql server firewall-rule create --resource-group $rgName --server $serverName -n AzureServices --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0
# Bu arada sunucu adındaki büyük harf kullanımı sorun çıkartabilir ki bende çıkarttı. Bu durumda sunucu adını Azure'un verdiği gibi küçük harfli olarak kullanmak gerekir.
serverName=burakselimSQLServer

screenshot_18.png

# Artık sunucu ve firewall izinleri hazır
# Veritabanı oluşturulabilir
az sql db create --resource-group $rgName --server $serverName --name CommodoreDB --service-objective Basic

Veritabanını başarılı şekilde oluşup oluşmadığını Azure portal'den görebiliriz.

screenshot_19.png

Local'den Azure'a Data Migration

Veritabanını oluşturduktan sonra local'deki veritabanı şemasını ve içeriğini taşıyabiliriz de. Bunun için Microsoft Data Migration Assistant aracından yararlanılabilir. Ancak Dashboard uygulaması üstünden Migration planı çalıştırıp Azure üzerinde veritabanı tablolarının oluşturulmasını ve ilk kayıtların eklenmesini de sağlayabiliriz. Bunun için Dashboard ve WebClient uygulamalarınının appSettings.json dosyalarındaki bağlantı bilgilerini Azure SQL veritabanını işaret edecek şekilde değiştirmemiz yeterlidir.

Bizim örneğimiz için aşağıdaki gibi.

Server=tcp:burakselimsqlserver.database.windows.net,1433;Database=CommodoreDB;User ID=scotie;Password=t1ger_tanks;Encrypt=true;Connection Timeout=30

İlk olarak Dashboard uygulamasını çalıştırırsak (ki bizim Admin arayüzümüzdür) Migration planı çalışır ve şema ile verile oluşur. (Elbette önceki denemelerde yerel veritabanına daha fazla veri eklenmişse Microsoft Data Migration Assistant veya benzeri bir aracı kullanmak daha doğru olacaktır) Sonrasında WebClient'ı çalıştırıp uygulamanın fonksiyonelliklerini test edebiliriz.

screenshot_20.png

Web Uygulamasının Azure App Service olarak Taşınması

Bu adımda ClassicGamesAzure solution'ı içerisindeki WebClient'ı, Azure tarafına taşıyacağız. Yine Azure Shell'i kullanabiliriz.

# ilk olarak bir Azure Service Plan oluşturalım.
# Azure Service Plan bir veya daha çok web uygulamasını barındırabilir ve bunların tamamı aynı fiziksel kaynakları kullanır.
# Örneğimiz için Free Tier planının (F1) kullanabiliriz.

# Gerekli değişkenler
planName=cgServicePlan
appName=buraksc64world

# Plan oluşturluyor
az appservice plan create --name $planName --resource-group $rgName --sku F1

# Web uygulaması oluşturuluyor
az webapp create --resource-group $rgName --plan $planName --name $appName

# Örneğimiz .Net 5 çalışma zamanını gerektiriyor. Kullanılabilecek runtime listesine bir bakalım.
az webapp list-runtimes
# Kuvvetle muhtemel .Net 5 çalışma zamanı orada olacaktır. Devam edebiliriz.

Azure tarafında web uygulaması için bir plan, bir uygulama ve çalışma zamanını oluşturduk. Peki makinedeki uygulamayı buraya nasıl publish edeceğiz. Visual Studio'un Publish Profile özelliğini bu anlamda işimizi epeyce kolaylaştıracaktır.

Bunu iki şekilde yapabiliriz. Azure Portal üstündeki Get publish Profile seçeneğiyle

ya da komut satırından (Azure Shell) aşağıdaki şekilde.

screenshot_21.png

az webapp deployment list-publishing-profiles --name $appName --resource-group $rgName --xml --output tsv

Profile dosyasını tahmin edileceği üzere projenin publish stratejisini belirlemek için kullanacağız. Bunun için ClassicGames.WebClient projesine sağ tıklayıp Publish seçeneğini kullanarak süreci başlatmalıyız.

screenshot_22.png

screenshot_23.png

Sonuçta aşağıdakine benzer bir çıktık ile karşılaşmalıyız.

screenshot_24.png

Sonrasında tek yapmamız gereken Publish düğmesine basmak. Paket hazırlanıp, profile bilgilerine göre Azure tarafına deploy edilecektir.

screenshot_25.png

Ardından Azure tarafındaki web uygulamasına giderek sistemin çalışıp çalışmadığını görebiliriz.

screenshot_26.png

Hatırlatmakta yarar var. Bir ihtimal veritabanını Azure tarafına migrate ettikten sonra bilgisayarı kapatmış olabilirsiniz. IP'niz statik değilse internete tekrar bağlandığınızda değişecektir. Bu durumda Firewall tarafındaki whitelist'e local IP nizi tekrar eklemeniz gerekir. local makineden Azure tarafına gidebilmek için bir tane ve Azure'daki App Service uygulamasından yine oradaki veritabanına ulaşmak için de bir tane olmak üzere toplamda iki işlem. Yukarıda bunları yapmıştık ;)

Uygulamaya Azure Function Eklenmesi

Kitap gerçekten çok güzel örnekler içeriyor. Başlangıçta .Net Framework 4.7.2 sürümünde olan çözüm içindeki uygulamaları .Net 5 uyumlu hale getirdikten sonra, veritabanı ve web tarafını Azure üzerine de almayı öğretti. Sıradaki adım ise HTTP ile tetiklenebilen bir Azure Function geliştirip bunu Web uygulamasından kullandırmak. Serverless olarak anlam bulan bu Azure Function'ın kitaptaki görevi yorumların duygu analizini simüle etmek. Anladığım kadarıyla hedefimiz yeni bir yorum eklendiğinde tetiklenecek Azure fonksiyon ile bu yorumun pozitif olup olmadığını tespit etmek. Benzer şekilde ilerleyeceğim.

Azure Function'ı geliştirmek için bu kez Azure Functions Core Tools'u kullanmaya karar verdim. Şu adrese uğrayarak Windows 10 için olan kurulumunu yaptım.

cd ClassicGamesAzure
# Azure Function Projesinin oluşturulması
func init Analysis --dotnet

# Projenin, solution'a eklenmesi
dotnet sln add .\Analysis\

# HTTP ile tetiklenecek fonksiyonun eklenmesi
cd Analysis
func new --name AlienistFunction --template "HTTP trigger" --authlevel "anonymous"

# Eğer istersek şu noktada fonkisyonun ilk halini, localde çalışacak şekilde test edebiliriz
func start

screenshot_27.png

Tabii bu Hello World modeli. Şimdi neler yaptığımıza bakalım.

  • Duygu durum analizi yapan servisi ekledik (IAlienistService sözleşmesi, uygulayan AlienistService sınıfı ve duygu durumunu belirten Report isimli Enum sabiti)
  • Yukarıdaki servisi DI ile almak için projeye Microsoft.Azure.Functions.Extensions nuget paketini ekledik.
    • dotnet add package Microsoft.Azure.Functions.Extensions
  • DI mekanizmasını fonksiyon başlatılırken kullanmamız gerekiyor. Bu nedenle FunctionStartup türevli bir Startup sınıfı ekleniyor. (FunctionsStartup nitelik kullanımı ve sınıf türetmesine dikkat edin. Birde DI uygulanışına tabii)
  • AlienistFunction içerisindeki Run fonksiyonunu da, AlienistService'i kullanacak şekilde değiştirdik.

Local Testler

Şu anda servisi local ortamda çalıştırıp hem url üstünden hem de Postman gibi bir araçla JSON içeriği göndererekten test edebiliriz. Uygulamayı komut satırından func start ile çalıştırabileceğimiz gibi, Visual Studio ile de başlatabiliriz. Visual Studio ile çalıştırma seçilirse ilk seferde sistemde yoksa Azure Emulator ve gerekli SDK lar indirilir. Bu da biraz zaman alabilir. Lakin Visual Studio üstünden uygulamayı Debug etmek ve kodun işleyişini görmek de oldukça keyifli.

# url testi için HTTP Get ile şunları deneyebiliriz
http://localhost:7071/api/AlienistFunction?content=Bugün güzel, nefis bir gün.
http://localhost:7071/api/AlienistFunction?content=Ne kadar iğrenç bir gündü yahu.

Bu iki çağrı için aşağıdaki sonuçları elde etmeliyiz.

screenshot_28.png

screenshot_29.png

Postman'den HTTP Post ile JSON içeriğini aşağıdaki gibi Body üstünden göndererek de ilerleyebiliriz. Yani hem HTTP Get ile hem de HTTP Post ile Azure fonksiyonumuzu tetiklememiz mümkün.

{
    "commentText": "Bugün çok güzel bir gün öyle değil mi? Dün çok kötü geçmişti ama bugün her şey yoluna girdi. Kendimi olağanüstü iyi hissediyorum."
}

screenshot_30.png

Azure Function için Deploy İşlemleri

Aslında ClassicGames.WebClient uygulamasının Azure platformuna taşınmasına nispeten benzer adımlarımız var. İlk önce bir storage account açacağız. Ardından Azure üstünde Function App oluşturup Publish işlemi için Profile dosyasını çekeceğiz. Local'deki uygulamamıza ilgili profili yükledikten sonra uygulamayı deploy edip test edeceğiz.

Storage Account açılması, function app oluşturulması gibi işlemleri yine Azure Shell üstünden yapabiliriz.

# yukarıda tanımlı resource group ve location bilgilerini burada da kullanıyoruz.
# rgName için cgAppResourceGroup ve location için germanywestcentral tanımlamalarını kullanmıştım
storageAccount=cgappstorageaccount
az storage account create -n $storageAccount -g $rgName -l $location --sku Standard_LRS

# Function App'ın oluşturulması
funcName=AnalystC64Fcuntion
az functionapp create --consumption-plan-location $location -n $funcName --os-type Windows -g$rgName --runtime dotnet --storage-account $storageAccount --functions-version 3

Eğer işler yolunda gittiyse ilgili fonksiyonun aşağıdakine benzer şekilde oluşması gerekir.

screenshot_31.png

Şimdi local bilgisayarımızdaki Azure Function'ı deploy etmek gibi bir amacımız var. Öncesinden Publish Profile içeriğini almalı, bunu Web uygulamasında yaptığımız gibi Import ederek uygulamayı taşımalıyız.

Profile içeriğinin çekilmesi. screenshot_32.png

Analysis projesinde sağ tıklayıp Publish denilmesi ve Import seçimi. screenshot_33.png

Dosya seçimi sonrası, Publish işleminin yapılması. screenshot_34.png

Sonuçta dağıtımın başarılı olmasını bekliyoruz. screenshot_35.png

Benim kendi denememde fonksiyonum http://analystc64fcuntion.azurewebsites.net adresinden erişilebilir hale geldi. Tabii bunu local'de yaptığımız gibi test etmemiz de gerekiyor. Postman'i bu amaçla kullanabiliriz, lakin öncesinde bu fonksiyonu kullanabilmemiz için gerekli Authentication Key'in elde edilmesi lazım.

# Fonksiyonun kullanılabilmesi için authentication key değerinin alınması
functionName=AlienistFunction # Bu Uygulamadaki fonksiyonumuzun adıydı
az functionapp function keys list -g $rgName -n $funcName --function-name $functionName

screenshot_36.png

Buradaki key değerini kullanarak URL'i yeniden organize edip testlerimizi yapabiliriz. Sadece Azure tarafından verilen adres ve authentication key değerlerini kullanmamız yeterli. Key değerini QueryString'de code parametresi ile taşıyoruz.

# url testi için HTTP Get ile şunları deneyebiliriz
http://analystc64fcuntion.azurewebsites.net/api/AlienistFunction?code=[Sizin için üretilen key değeri olmalı]&content=Bugün harika bir gün.
http://analystc64fcuntion.azurewebsites.net/api/AlienistFunction?code=[Sizin için üretilen key değeri olmalı]&content=Ne kadar iğrenç bir gündü yahu.

Yukarıdaki denemelerden birisine ait çıktı aşağıdaki gibi olacaktır.

screenshot_37.png

Yine aynı adresi, code isimli querystring parametresi ve aşağıdaki JSON içeriği ile kullanabiliriz.

{
    "commentText": "Bugün çok güzel bir gün öyle değil mi? Dün çok kötü geçmişti ama bugün her şey yoluna girdi. Kendimi olağanüstü iyi hissediyorum."
}

Sonuç aşağıdaki ekran görüntüsündekine benzer olmalıdır.

screenshot_38.png

Azure Function Uygulamasının Web Uygulamasına Entegre Edilmesi

Şimdiki amaç oyunlarla ilgili yorum eklenen sayfada girilen metnin pozitif olup olmadığını anlamak için yukarıda geliştirdiğimiz Azure fonksiyonunu kullanmak. Basit olması açısından bir yorum eklendiğinde veya var olan yorum güncellendiğinde, duygu analizini yapacak Azure fonksiyonu çağırıp, sonucunu GameReview tablosuna yeni eklediğimiz CommentScore alanına yazdıracağız. Yapacağımız değişiklikler şöyle.

  • appSettings.json içerisine servise ait konfigurasyon bilgilerini ekledik. Ayrıca konfigurasyon sekmesini kod tarafında karşılamak için bir sınıf gerekiyor (AlienistServiceOptions.cs) Sınıf ile json bölümünü Startup.cs içerisindeki ConfigureServices metodunda ilişkilendiriyoruz.
  • GameReviewController sınıfına, yorumun içeriğini değerlendirecek servis çağrısını yapması için AnalyzeComment isimli bir metot eklendi.
  • GameReview tipinde CommentScore isimli yeni alanın kullanılması için gerekli değişiklikler yapıldı.

Çalışma zamanında en azından tablodaki CommentScore alanındaki değişimleri görebilyor olmamız lazım.

screenshot_39.png

Elbette bu tam anlamıyla gerçek hayat senaryosu değil. Azure Func'ın çağırılması sırasındaki olası gecikmeler sayfanın cevap verebilirliğini olumsuz yönde etkileyebilir. Belki de comment'leri asenkron çağrı ile gönderdiğimiz Azure Fonkisyonu bu hesaplamayı bir olay ile ilişkilendirip RabbitMQ kuyruğuna bırakmalı. Burayı dinleyen başka bir Worker Service'te ilgili olay meydana geldiğinde asıl değişikliği uzak veritabanına doğru yapmalı. Bunun gibi bir kurgu çok daha yerinde olabilir.

Azure Kaynaklarını Silmek İçin

Her ne kadar deneysel bir çalışma olsa da kaynakları temizlemekte yarar var. Bunun için Azure Shell üstünden aşağıdaki komutları çalıştırmak yeterli olacaktır.

rgName=cgAppResourceGroup
az group delete --name $rgName

Docker Compose Desteğinin Eklenmesi

Visual Studio gibi bir ortamda geliştirme yapıyorsak DockerFile oluşturulması veya Docker Compose ortamının hazırlanması son derece kolaydır. Örneğin Docker Compose desteğini eklemek istersek, projeye sağ tıkladıktan sonra Add -> Container Orchestrator Support adımını seçip, Target OS olarak da Linux tarafını işaretlemek yeterli olacaktır. Visual Studio gerekli docker-compose.yaml dosyasını otomatik olarak üretir ve imajları da otomatik olarak yükler. Sonrasında docker-compose seçeneği ile projeyi başlatabiliriz.

screenshot_40.png

Aşağıdaki ekran görüntüsünden de görüleceği üzere web uygulaması Docker Container olarak ayağa kalkmış ve çalışır haldedir. Birden fazla servisimin olduğu durumlarda Docker-compose işimizi kolayşatıracaktır. Neredeyse sıfır efor sarf ettiğimizi ifade edebilirim. Tabii birde Project Tye tarafına bakmanızda yarar olabilir ;) screenshot_41.png

Kaynak

About

.Net 4.7.2 tabanlı bir uygulamalar bütününü Net 5'e taşımak konulu kişisel öğretidir. Malum Net 5, .Net Framework dönemlerinden gelen bazı konuları artık içermiyor/desteklemiyor. WPF, WCF, WWF, .Net Remoting buna örnek olarak verilebilir.Herhalde 2020ler Net 5'in yılları olacak. Bu noktada 2000lerden gelen ve evrilerek .Net 4.8'e kadar çıkan bir…

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published