C # httplistener без использования NetSH для регистрации URI

StackOverflow https://stackoverflow.com/questions/2583347

Вопрос

Мое приложение использует небольшой веб-сервер для сервера некоторых файлов и иметь веб-интерфейс для администрирования удаленно. Прямо сейчас пользователь должен использовать NetSH, чтобы зарегистрировать URI, так

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

Что не весело для среднего пользователя. Я хотел бы, чтобы программа сможет слушать любой порт, указанный пользователем из моей программы без конечного пользователя, которому нужно использовать командную строку. Есть ли в любом случае, чтобы выполнить эту недолго, просто используя процесс .start и работает командная подсказка?

Это было полезно?

Решение

Я написал это, чтобы поднять перми и добавлять HTTP ACL-записи через Netsh..

Пользователям будет предложено внести изменения в их системе, но это лучше, чем ничего. Возможно, вы захотите сделать это в ответ на AddressaccessdeniedException.

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();
    }
}

Другие советы

Если вы используете httplistener, вы должны использовать httpConfig.exe или netsh, чтобы настроить свой httplistener, потому что:

A. AFAIK Нет API для этого от C #, только инструменты командной строки

B. По умолчанию только система или локальная группа администраторов может прослушать префиксы HTTP

Итак ... Если ваше приложение работает под учетной записью пользователя, вам необходимо явно предоставить доступ (с использованием httpcfg.exe или netsh), потому что ваш httphandler использует http.sys для обмена портами с запущенным веб-сервером (так что вы можете разместить свой собственный Веб-приложение на порту 80, пока IIS работает в порту 80, а также).

Лучшим решением может быть использование фактического встроенного веб-сервера для прослушивания порта, который вам нужен. Это не будет работать, если другое приложение (например, IIS) уже использует порт, но так как это не использует http.sys для совместного использования портов, нет никаких ограничений безопасности о том, какая учетная запись пользователя открывается / прослушивает в порту Отказ Поскольку вы хотите, чтобы пользователь указывал свой собственный порт, это, кажется, приемлемым запустить на другом порту, кроме порта 80.

Моя компания делает коммерческий продукт под названием Neokernel Web Server (http://www.neokernel.com.) Это запускает ASP.NET и позволяет вам программно запускать / остановить сервер и установить конфигурации; Вы можете встроить и распространять эту сборку с приложением.

Существует также исходный код CASSINI, который вы можете изменить и встроить, это бесплатно, но имеет пару недостатков, таких как без журнала или поддержки SSL.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top