Frage

Meine Anwendung verwendet einen kleinen Webserver, um einige Dateien aufzutragen und über eine Weboberfläche für die Verwaltung aus der Ferne zu verfügen. Derzeit muss der Benutzer NetSH verwenden, um die URI so zu registrieren

netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris

Das macht keinen Spaß für den durchschnittlichen Benutzer. Ich möchte, dass das Programm in der Lage ist, einen von dem Benutzer aus meinem Programm angegebenen Port anhören zu können, ohne dass der Endbenutzer die Eingabeaufforderung verwenden muss. Gibt es ohnehin, um dies zu erreichen, um nur den Prozess zu verwenden.

War es hilfreich?

Lösung

Ich habe dies geschrieben, um die Dauerwelle zu erhöhen und HTTP -ACL -Einträge durch hinzuzufügen netsh.

Benutzer werden aufgefordert, Änderungen vorzunehmen, aber es ist besser als nichts. Vielleicht möchten Sie dies als Antwort auf eine tun AdressAccessdeniedexception

public static class NetAclChecker
{
    public static void AddAddress(string address)
    {
        AddAddress(address, Environment.UserDomainName, Environment.UserName);
    }

    public static void AddAddress(string address, string domain, string user)
    {
        string args = string.Format(@"http add urlacl url={0} user={1}\{2}", address, domain, user);

        ProcessStartInfo psi = new ProcessStartInfo("netsh", args);
        psi.Verb = "runas";
        psi.CreateNoWindow = true;
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.UseShellExecute = true;

        Process.Start(psi).WaitForExit();
    }
}

Andere Tipps

Wenn Sie einen httplistener verwenden, müssen Sie httpconfig.exe oder netSH verwenden, um Ihr httplistener zu konfigurieren, da:

A. AFAIK Es gibt keine API dafür aus C#, nur die Befehlszeilen -Tools

B. Standardmäßiges System oder die lokale Administratorgruppe kann HTTP -Präfixe anhören

Also ... wenn Ihre App unter dem Konto des Benutzers ausgeführt wird, müssen Sie explizit Zugriff (mit httpcfg.exe oder netsh) gewähren, da Ihr HTTPHandler die http.sys verwendet Web -App auf Port 80, während IIS auch auf Port 80 ausgeführt wird).

Eine bessere Lösung könnte darin bestehen, einen tatsächlichen eingebetteten Webserver zu verwenden, um den von Ihnen benötigten Port anzuhören. Dies funktioniert nicht, wenn eine andere Anwendung (z. B. IIS) bereits den Port verwendet. Da dies jedoch nicht die http.sys für die Port-Sharing verwendet . Da der Benutzer seinen eigenen Port angibt, erscheint es akzeptabel, neben Port 80 auf einem anderen Port auszuführen.

Mein Unternehmen macht ein kommerzielles Produkt namens Neokernel Web Server (http://www.neokernel.com) mithilfe von ASP.NET und ermöglicht es Ihnen, den Server programmatisch zu starten/stoppen und Konfigurationen festlegen. Sie können diese Baugruppe mit der Anwendung einbetten und verteilen.

Es gibt auch den Cassini -Quellcode, den Sie ändern und einbetten können. Er ist kostenlos, verfügt jedoch über ein paar Nachteile, wie keine Protokollierung oder SSL -Unterstützung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top