Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Hqrtz
Thema: Pre-, Post- und inorder Traveriserung von Graphen
Am im Forum: Rund um die Programmierung

Ok vielen Dank für die uper Erklärung. Hat mir wirklich sehr weitergeholfen!!

Danke

Thema: Pre-, Post- und inorder Traveriserung von Graphen
Am im Forum: Rund um die Programmierung

Hallo

Ich habe eine Frage zur Traversierung von Graphen.

Ich kenne die Preorder, Postorder und Inorder Traversierung nur von Bäumen oder Binären Bäumen.
Auch auf vielen Erklärseiten wird geschrieben, dass es sich bei diesen Traversierungen um Traversierungsmöglichkeiten von (Binär) Bäumen handelt.

Kann man diese drei auch auf Graphen, bei denen jeder Knoten mit jedem Verbunden ist o.ä. verwenden?
Für Pre- und Postorder habe ich hier ein Video gefunden, welches dies gut erklärt: https://www.youtube.com/watch?v=_2eDPL-kjIo
Geht dies auch für Inorder oder kann man bei solchen Graphen nur Pre- und Postorder verwenden?
Und wieso werden die drei Algorithmen (sind ja alles eine Form der Tiefensuche) haupsächlich für Bäume erklärt?

Vielen Dank schonmal

Thema: Templating mit Azure Functions
Am im Forum: Web-Technologien

Ok super vielen Dank!! hat gerade funktioniert.

Ich habe Directory.GetCurrentDirectory genutzt weil es lokal funktioniert hat. Der ExecutionContext allerdings auch.
Nur beim Publishen hat der mir angezeigt das er in einem File nach der View sucht und die View da nicht findet. Und der Path wo der gesucht hat, war genau der, der bei GetCurentDirectory rauskam. Deswegen hatte ich es probiert.

Aber da es jetzt funktioniert hat solltest du jetzt hier deine Ruhe vor mir haben Hast heute aufjednefall deine Gute Tat für den Tag erfüllt

Thema: Templating mit Azure Functions
Am im Forum: Web-Technologien

Also ich habe es jetzt so probiert:


[FunctionName("RenderTemplate")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log, ExecutionContext executionContext)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            var engine = new RazorLightEngineBuilder()
                .UseEmbeddedResourcesProject(typeof(ModelClass))
                .SetOperatingAssembly(typeof(ModelClass).Assembly)
                .UseFileSystemProject(Directory.GetCurrentDirectory())
                .UseMemoryCachingProvider()
                .Build();

            log.LogInformation("context: " + executionContext.FunctionAppDirectory);
            log.LogInformation("Directory: " + Directory.GetCurrentDirectory());
            log.LogInformation("find View: " + Path.GetDirectoryName("View.cshtml"));

            var template = File.ReadAllText(@"./View.cshtml", System.Text.Encoding.UTF8);

            var name = myService.GetName();
            var model = new ModelClass
            {
                Name = name
            };

            string result = await engine.CompileRenderStringAsync("templateKey", template, model);

            return new OkObjectResult(result);
        }

Die Ausgabe im azure Portal lautet wie folgt:
Fehler
2021-05-09T08:51:17.524 [Information] Executing 'RenderTemplate' (Reason='This function was programmatically called via the host APIs.', Id=7f2d712b-2069-4320-a39b-f46050e61168)
2021-05-09T08:51:17.524 [Information] C# HTTP trigger function processed a request.
2021-05-09T08:51:17.528 [Information] context: C:\home\site\wwwroot
2021-05-09T08:51:17.528 [Information] Directory: C:\Program Files (x86)\SiteExtensions\Functions\3.0.15584\32bit
2021-05-09T08:51:17.528 [Information] find View:
2021-05-09T08:51:18.023
Fehler
Executed 'RenderTemplate' (Failed)Could not find file 'C:\Program Files (x86)\SiteExtensions\Functions\3.0.15584\32bit\View.cshtml'.

Also eig findet der doch über Directory.GetCurrentDirectory() genau den richtigen pfad wo der dann laut der Fehlermeldung die View sucht oder nicht?
Aber ich verstehe nicht warum der die View nicht finden kann...
Ich habe bei der View "Copy To Output Directory: Copy Always" eingestellt.

Meine Struktur sieht so aus, dass ich einfach alles direkt im Projekt erstellt habe. Also keinen extra View ordner oder so. Das würde ich dann machen, wenn es funktionieren sollte.

Und ich hatte es auch mit


 var engine = new RazorLightEngineBuilder()
                .UseEmbeddedResourcesProject(typeof(ModelClass))
                .SetOperatingAssembly(typeof(ModelClass).Assembly)
                .UseFileSystemProject(executionContext.FunctionAppDirectory)
                .UseMemoryCachingProvider()
                .Build();

probiert aber da der ja nicht im wwwroot ordner nach der view sucht, hat das auch nichts geholfen

Thema: Templating mit Azure Functions
Am im Forum: Web-Technologien

Hallo

ich habe eine Azure Function erstellt, die RazorLight zum Templating eines Dokuments nutzt.
Dazu habe ich eine .cshtml Datei erstellt mit HTML-Code und habe eingestellt, dass die Datei ins OutputDirectory kopiert wird. Diese lese ich dann in einen string ein.


var engine = new RazorLightEngineBuilder()
	// required to have a default RazorLightProject type,
	// but not required to create a template from string.
	.UseEmbeddedResourcesProject(typeof(ViewModel))
	.SetOperatingAssembly(typeof(ViewModel).Assembly)
	.UseMemoryCachingProvider()
	.Build();

string template = var template = File.ReadAllText("./View.cshtml")
ViewModel model = new ViewModel {Name = "John Doe"};

string result = await engine.CompileRenderStringAsync("templateKey", template, model);


Ich hatte eig gehofft, dass das so mit dem OutputDirectory auch bei gepublishten Azure Funtions funktioniert. Ich würde nur ungern das ganze Templating direkt über einen String machen sondern das Template lieber in einer externen Datei schreiben, die ich dann einlese. Hat da jemand eine Idee wie ich sowas umsetzen kann?

RazorLight bietet ja auch eine Lösung mit einem File an:


var engine = new RazorLightEngineBuilder()
	.UseFileSystemProject("C:/RootFolder/With/YourTemplates")
	.UseMemoryCachingProvider()
	.Build();

var model = new {Name = "John Doe"};
string result = await engine.CompileRenderAsync("Subfolder/View.cshtml", model);

Aber hierbei wäre woeder das selbe Problem denke ich, dass der das nicht finden wird?

Vielen Dank schonmal

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ja das tut mir leid das ich so vom Thema abweiche
Ok ich probiere nochnmal das wichtigste hier einzustellen.

Also ich hatte alles mit Razorlight rausgenommen und es lief aufeinmal. Ich habe keine Ahnung wieso


<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
    <_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.2" />
    <PackageReference Include="RazorLight" Version="1.1.0" />
    <PackageReference Include="RazorLight.NetCore3" Version="3.0.2" />
    <PackageReference Include="RestSharp" Version="106.11.7" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

Startup:


[assembly: FunctionsStartup(typeof(FunctionApp1.Startup))]

namespace FunctionApp1
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var config = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
             .AddEnvironmentVariables()
             .Build();

            builder.Services.AddTransient<IApiService, ApiService>();
            builder.Services.AddTransient<IMainService, MainService>();
            builder.Services.AddTransient<ITemplateService, TemplateService>();
            builder.Services.AddTransient<IEmailService, EmailService>();
        }
    }
}

Funktion:



namespace FunctionApp1
{
    public class Function1
    {
        private readonly IMainService mainService;

        public Function1(IMainService mainService)
        {
            this.mainService= mainService;
        }

        [FunctionName("Function1")]
        public void Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            mainService.Run();
         
        }
    }
}

MainService:


namespace FunctionApp1.Services
{
    public class MainService: IMainService
    {
        private readonly IApiService apiService;
        private readonly ITemplateService templateService;
        private readonly IEmailService emailService;

        public MainService(IApiService apiService, ITemplateService templateService, IEmailService emailService)
        {
            this.apiService= apiService;
            this.templateService= templateService;
            this.emailService = emailService;
        }

        public void Run()
        {
            
            var result= GetDataFromApi
            
            var template= templateService.RenderTemplate(result).Result;

            emailService.SendEmail(template);
           
        }

TemplateService:


namespace FunctionApp1.Services
{
    public class TemplateService: ITemplateService
    {
        public async Task<string> RenderTemplate(List<Items> itemListe)
        {
            var engine = ConfigEngine();
            var template = File.ReadAllText(@"./RazorTemplate.cshtml", System.Text.Encoding.UTF8);

            var model = new Model
            {
                itemListe= itemListe
            };

            return await engine.CompileRenderStringAsync("Key9", template, model);
        }

        private RazorLightEngine ConfigEngine()
        {
            var engine = new RazorLightEngineBuilder()
                .UseEmbeddedResourcesProject(typeof(Model))
                .SetOperatingAssembly(typeof(Model).Assembly)
                .UseMemoryCachingProvider()
                .Build();

            return engine;
        }
    }
}

RazorTemplate:


@model Function1.Model.Model
<!DOCTYPE html>
<html>
<head>
</head>
<body>
    @foreach (var liste in @Model.itemListe)
    {
         <p>liste.text</p>
    }   
</body>
</html>

Also ich führe die Funktion aus. Die ruft über eine API Daten ab. Mit Razor erstelle ich damit ein Dokument und schicke mir das per email.
Funktioniert auch lokal alles soweit nur eben wenn ich es publishe nicht





Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ok dabnke dafür. Also ich konnte den Fehler identifizieren. Ich nutze RazorLight. Das scheint nicht mit Azure Functions kompatibel zu sein. Wenn ich den teil raus nehme, funktioniert es problemlos. Mit geht es leider nicht.

Kennst du oder jemand anderes eine alternative zu RazorLight zum Templating?

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also Runtime version ist laut der Overview seite im Portal: 3.0.15584.0 bzw in den App settings im Portal steht ~3
function version v3 und Framework .net core 3.1

Hier ist genau das selbe Problem das ich auch habe: https://github.com/Azure/azure-functions-host/issues/6861 und hier https://github.com/Azure/Azure-Functions/issues/972#issuecomment-426708865
extensionsbundle in host.json habe ich garnicht und soweit ich getestet habe ist es egal welchen Service ich in der Starup nicht auskommentiere.

Gibt es eine andere runtime version die ich probieren kann?

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ja das kann gut sein das mein Klassen/namespace Design komisch ist. Da habe ich nicht soo drauf geachtet

Ich habe das Projekt. Darin den Ordner Services.
Außerdem habe ich direkt im Projekt die Funktion Klasse und die Startup. Und halt local settings etc.

Und die Funktion heißt halt genauso wie das Projekt und damit auch wie der Namespace. Glaube das passiert automatisch beim Anlegen eines Funktion Projekts. Habe da eig nur den Projektnamen eingegeben und die Funktion heißt dann genauso wenn ich mich nicht vertue.

Aber eig sollte das DI so wie ich es habe auch beim publishen klappen? Also wie gesagt local funktioniert es aufjedenfall. Nur nach dem publishen nicht mehr lokal. In einem 1:1 neu erstellten Funktion Projekt geht es aber wieder...

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also ich habe extra nochmal nachgeguckt. Der Namespace in der Function.cs heißt definition 1:1 wie die Function Klasse sowie in [FunctionName("Function")]

Ich habe jetzt nochmal eine Function erstellt und meinen Code rüberkopiert und die läuft jetzt. Also muss beim publishen irgendwas kaputt gegangen sein aber kp was.
Ich habe einen Storage Acc erstellt, dann die function app und auf Publish gedrückt. Funktioniert das DI nicht so wie ich das gemacht habe beim publishen?
Werde das DI dann morgen mal mit Isolated Prozess probieren. Vlt klappt es dann ja...

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ok ich denke ich werde mit den Isolated Process nochmal angucken.

Vlt hängt ein weiteres Problem auch damit zusammen. Nach dem ich testweise meine Function gepublished habe, kann ich die auch nicht mehr lokal ausführen.
Ich bekomme immer so einen Dependency Injektion Fehler:

Fehler
Executed 'Function' (Failed, Duration=62ms)
Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'Function.Services.IMeinService' while attempting to activate 'Function.Function'.
An unhandled host error has occurred.
Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'Function.Services.IMeinService' while attempting to activate 'Function.Function'.

Hiernochmal der wichtigste Code:

Function:


public class Function
    {
        private readonly IMeinService meinService;

        public Function(IMeinService meinService)

        {
            this.meinService= meinService;
        }

        [FunctionName("Function")]
        public void Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
       
             meinService.Main();       
        }

Startup:



[assembly: FunctionsStartup(typeof(Function.Startup))]

    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var config = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
             .AddEnvironmentVariables()
             .Build();

            builder.Services.AddTransient<IMeinService, MeinService>();
            //weitere Services
        }
    }
}


Wie gesagt für mich ergibt das keinen Sinn und kann nur was mit dem Publishen zutun haben?
Vlt kannst du mir ja dabei helfen. Das sollte doch so auch ohne Isolated Process gehen oder?

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen


Mit "ILogger an der Methode annehmen" meinst du als Parameter jeder Methode übergeben? dachte da nur das das vlt nicht soo schön ist und eher gegen Dependency Injektion spricht so wie ich es bisher gemacht habe.

Also mein Dependency Injektion sieht eig genauso aus wie bei dir nur das ich eben meine Services als Transiant registriere und AddLogging().
Wenn ich das richtig verstehe ist das dann so richtig wie ich das gemacht habe nur es wird nicht in der Konsole angezeigt aber in ApplicationInsights wenn ich die Variable dafür setze?

Würde ungern die Architektur jetzt ändern, nur um Logging anders / besser nutzen zu können. Serilog habe ich bisher nicht genommen, weil ich eig nur Loggen möchte welche Methode aufgerufen wird und das sollte ja auch mit dem ILogger gehen

Thema: Logging in Azure Function
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

Ich habe eine Frage zum ILogger in Azure Functions.
Mein Code sieht wie folgt aus:


private ILogger<Function> logger;
private MeinService service;

        public Konstruktor(MeinService service, ILogger<MeinService> logger)
        {
            this.service= service;
            this.logger = logger;
            
        }

        [FunctionName("Function")]
        public void Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req)
        {
            logger.LogInformation("C# HTTP trigger function processed a request.");
            service.Main();


Service:


public class MeinService()
{
private ILogger<MeinService> logger;

        public Konstruktor(ILogger<MeinService> logger)
        {
            this.logger = logger;
        }

        public void Main()
        {
            logger.LogInformation("Test");
            //tut irgendwas
        }

}

Dependency Injektion:


public override void Configure(IFunctionsHostBuilder builder)
        {
             //services
             builder.Services.AddLogging();
        }

host.json:


{
    "version": "2.0",
    "logging": {
      "applicationInsights": {
        "samplingExcludedTypes": "Request",
        "samplingSettings": {
          "isEnabled": true
        }
      },
      "logLevel": {
        "MeinNamespace.Function": "Information"
      }
    }
}

Nun zu meiner Frage: Es werden in der Function Konsole keine Lognachrichten ausgegeben. Habe ich etwas falsch gemacht?
Ich habe es genauso in einer normalen Konsolenanwendung ausprobiert und da lief es problemlos.
Hier habe ich gefunden, dass es wohl normal sei das bei einer lokalen Ausführung keine Logausgaben angezeigt werden.
https://jan-v.nl/post/first-steps-into-logging-of-your-azure-functions/
Da das aber das erste mal ist das ich sowas gefunden habe und auf den anderen seiten davon nichts stand, wollte ich sichergehen, dass ich keinen Fehler gemacht habe.
Wenn ich den standard ILogger ohne DI an die Methoden übergeben würde, würde ja etwas auf der Konsole ausgegeben werden...

Wäre super wenn mir da jemand eine Antwort zu geben kann.
Viele Grüße