WebApp.Start in Windows-Anwendung

CopWorker

Erfahrenes Mitglied
Hallo zusammen,

ich stehe mal wieder auf dem Schlauch.

Ich möchte einen Webservice einrichten. Das geht auch, aber nur in einer Konsolenanwendung.
Es wir ein Port (Local Port) 20000 mit dem State "LISTENING" eingerichtet.
Der Port bleibt erhalten solange das Konsolenfenster geöffnet bleibt. Das leuchtet mir auch ein.

C#:
using Microsoft.Owin.Hosting;
C#:
try
{
    using (WebApp.Start<Startup>("http://101.0.0.1:20000"))
    {
        Console.WriteLine($"API Base URL: {startUrl}");
        Console.WriteLine($"API Documentation URL: {startUrl}/swagger");
        Console.WriteLine("Close API by pressing any key.");

        Console.ReadKey();
    }
}
catch (Exception ex)
{
    Console.WriteLine(Convert.ToString(ex));
    Console.ReadKey();
}


Jetzt kommt die Herausforderung.
Wie mach ich das in einer Windows - Anwendung oder Klassenbibliothek?
Der Port "20000" wird unmittelbar nach Aufruf der nachfolgenden Funktion eingerichtet
und unmittelbar nach Verlassen dieser Funktion wieder aufgelöst.
Ich vermute, dass ich anstatt der Konsole einen Thread brauche.
Was soll ich als Thread deklarieren?
Die "WebApp" Klasse
C#:
private static Thread WebApp;
oder
die "StartWebApp" Methode
C#:
private static Thread StartWebApp;

Und wie komme ich später an die Parameter (Variablen, Properites, usw.) der "Startup" Klasse ran?

C#:
public int StartWebApp(ref string strAMsg)
{
    int iRet = 0;

    try
    {
        using (WebApp.Start<Startup>("http://101.0.0.1:20000"))
        {
            //TODO: Hier entprechendes Flag setzen um die Ereignisse im Ausgabefeld ausgegeben werden
        }
    }
    catch (Exception exp)
    {
        strAMsg = exp.Message + "$;$" + (!string.IsNullOrEmpty(exp.InnerException.Message) ? exp.InnerException.Message : "");
        iRet = -1;
    }

    return iRet;
}

Hier die "Startup" Klasse
C#:
public class Startup
{
    
    /// <summary>
    /// Standardkonstruktor der Klasse
    /// </summary>
    public Startup()
    {

    }

    public void Configuration(IAppBuilder appBuilder)
    {
        var config = new HttpConfiguration();

        config.MapHttpAttributeRoutes();
        appBuilder.UseCors(CorsOptions.AllowAll);
        config.EnableSwagger(c => { c.SingleApiVersion("v1", "Demo"); }).EnableSwaggerUi();
        appBuilder.UseWebApi(config);
        config.EnsureInitialized();
    }
}

Vielen Dank im Voraus.
Grüße von CopWorker
 

Spyke

Premium-User
der Thread würde wohl deine WebApp auch sofort wieder beenden solange du nicht dafür sorgst das die Ausführung beibehalten bleibt, ne Schleife oder so.

Meine einfache Idee wäre erstmal bei einer Windows Anwendung dort quasi die Nachrichtenschleife zu eigen zu machen

z.B. so, ich geh jetzt mal von WinForms aus
C#:
        [STAThread]
        static int Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            using (var webApp = WebApp.Start<Startup>("http://101.0.0.1:20000"))
            {
                Application.Run(new MeinFormular(webApp)); //webApp ans Formular für die weitere Verarbeitung geben
            }
        }


oder webApp als privates Feld halten und instanziieren und dann später selbst für den Dispose sorgen
 

CopWorker

Erfahrenes Mitglied
Hallo Spyke,

das mit dem Thread war nicht ganz der richtige Weg.

Einfacher geht´s mit:

C#:
private IDisposable iDisp;

Dann die Instanz als Rückgabewert global führen.

Code:
try
{
    iDisp = WebApp.Start<Startup>("http://101.0.0.1:20000");
}
catch (Exception exp)
{
    strAMsg = exp.Message + "$;$" + (exp.InnerException != null && !string.IsNullOrEmpty(exp.InnerException.Message) ? exp.InnerException.Message : "");
    iRet = -1;
}

Auflösen:
C#:
try
{
    if (iDisp != null)
    {
        iDisp.Dispose();
        iDisp = null;
    }
    else
    {
        strAMsg = "Vermutlich war der Web Service bereits aufgelöst";
        iRet = 1;
    }
}
catch (Exception exp)
{
    strAMsg = exp.Message + "$;$" + (exp.InnerException != null && !string.IsNullOrEmpty(exp.InnerException.Message) ? exp.InnerException.Message : "");
    iRet = -1;
}

Grüße von CopWorker
 

Neue Beiträge