Я пишу HTTP-сервер в C #.
Когда я пытаюсь выполнить функцию, HttpListener.Start()
я получаю HttpListenerException
высказывание
"В доступе отказано".
Когда я запускаю приложение в режиме администратора в Windows 7, оно работает нормально.
Можно ли заставить его работать без режима администратора? если да как? Если нет, как я могу перевести приложение в режим администратора после запуска?
using System;
using System.Net;
namespace ConsoleApplication1
{
class Program
{
private HttpListener httpListener = null;
static void Main(string[] args)
{
Program p = new Program();
p.Server();
}
public void Server()
{
this.httpListener = new HttpListener();
if (httpListener.IsListening)
throw new InvalidOperationException("Server is currently running.");
httpListener.Prefixes.Clear();
httpListener.Prefixes.Add("http://*:4444/");
try
{
httpListener.Start(); //Throws Exception
}
catch (HttpListenerException ex)
{
if (ex.Message.Contains("Access is denied"))
{
return;
}
else
{
throw;
}
}
}
}
}
windows-7
c#-4.0
uac
httplistener
Рэндалл Флэгг
источник
источник
Ответы:
Да, вы можете запустить HttpListener в режиме без прав администратора. Все, что вам нужно сделать, это предоставить разрешения для конкретного URL. например
Документация здесь .
источник
httpListener.Prefixes.Add("http://*:4444/");
должен точно соответствовать URL-адресу вnetsh
команде. Например, у меня былаhttpListener.Prefixes.Add("http://127.0.0.1:80/");
и та жеnetsh
команда, что и у вас, и HttpListenerException все равно будет выброшен. Мне нужно было изменить.httpListener.Prefixes.Add("http://+:80/");
Спасибо за вашу помощь @Darrel Miller, потому что вы помогли мне разобраться в этом!The parameter is incorrect
ошибку. Пример:url=http://+:80/
http://localhost:80/
? У меня есть настольное приложение, которому нужно получить один запрос на такой URL-адрес, и, кажется, стыдно требовать, чтобы администратор установил его на 50 рабочих столах, только для этой цели.Вы не можете, это должно начаться с повышенных привилегий. Вы можете перезапустить его с помощью
runas
глагола, который предложит пользователю перейти в режим администратораРЕДАКТИРОВАТЬ: на самом деле это не так; HttpListener может работать без повышенных привилегий, но вам нужно дать разрешение для URL, который вы хотите прослушать. Смотрите ответ Даррела Миллера для деталей.
источник
Если вы используете
http://localhost:80/
префикс, вы можете прослушивать http-запросы без необходимости иметь права администратора.источник
http://localhost:80/
и получил «Отказано в доступе».httpListener.Prefixes.Add("http://*:4444/");
действительно показываетAccess Denied
ошибку, ноhttpListener.Prefixes.Add("http://localhost:4444/");
работает без проблем. Похоже, Microsoft исключенаlocalhost
из этих ограничений. Интересно, что по-httpListener.Prefixes.Add("http://127.0.0.1:4444/");
прежнему отображается ошибка «Отказано в доступе», поэтому единственное, что работает,localhost:{any port}
Синтаксис был неверным для меня, вы должны включить кавычки:
в противном случае я получил "Параметр неверен"
источник
/
на URLЕсли вы хотите использовать флаг «user = Everyone», вам нужно настроить его на свой язык системы. На английском это как упомянуто:
На немецком это будет:
источник
В качестве альтернативы, которая не требует повышения прав или netsh, вы также можете использовать TcpListener, например.
Ниже приведен измененный отрывок из этого примера: https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthDesktopApp
Методы чтения и записи:
источник
new UTF8Encoding(false)
, который отключает выдачу спецификации. Я уже изменил это в ответеВы можете запустить свое приложение как администратор, если добавите Application Manifest в свой проект.
Просто добавьте новый элемент в ваш проект и выберите «Файл манифеста приложения». Измените
<requestedExecutionLevel>
элемент на:источник
По умолчанию Windows определяет следующий префикс, доступный каждому: http: // +: 80 / Temporary_Listen_Addresses /
Таким образом, вы можете зарегистрировать свой
HttpListener
через:Prefixes.Add("http://+:80/Temporary_Listen_Addresses/" + Guid.NewGuid().ToString("D") + "/";
Это иногда вызывает проблемы с программным обеспечением, таким как Skype, которое будет пытаться использовать порт 80 по умолчанию.
источник
вы используете "*", чтобы выполнить следующий cmd как администратор
не использовать +, должен использовать *, потому что вы специфицируете *: 4444 ~.
https://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
источник
.Add("http://+:9000/")
Я также столкнулся с подобной проблемой. Если вы уже зарезервировали URL-адрес, то сначала необходимо удалить URL-адрес, чтобы запустить его в режиме без прав администратора, иначе произойдет сбой с ошибкой Access is Denied.
источник