Piszę serwer HTTP w C #.
Kiedy próbuję wykonać tę funkcję HttpListener.Start()
, słyszę HttpListenerException
powiedzenie
"Brak dostępu".
Kiedy uruchamiam aplikację w trybie administratora w systemie Windows 7, działa dobrze.
Czy mogę to uruchomić bez trybu administratora? jeśli tak, jak? Jeśli nie, jak mogę zmienić aplikację w tryb administratora po uruchomieniu?
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
Randall Flagg
źródło
źródło
Odpowiedzi:
Tak, możesz uruchomić HttpListener w trybie innym niż administrator. Wszystko, co musisz zrobić, to przyznać uprawnienia do określonego adresu URL. na przykład
Dokumentacja jest tutaj .
źródło
httpListener.Prefixes.Add("http://*:4444/");
musi być DOKŁADNIE zgodny z adresem wnetsh
poleceniu. Na przykład miałemhttpListener.Prefixes.Add("http://127.0.0.1:80/");
i to samonetsh
polecenie, które masz, a HttpListenerException nadal będzie generowany. Musiałem to zmienić.httpListener.Prefixes.Add("http://+:80/");
Dziękuję za pomoc @Darrel Miller, ponieważ wprowadziłeś mnie na właściwą ścieżkę, aby to rozgryźć!The parameter is incorrect
błąd. Przykład:url=http://+:80/
http://localhost:80/
? Mam aplikację komputerową, która musi otrzymać jedno żądanie na taki adres URL i szkoda wymagać, aby administrator zainstalował ją na 50 komputerach stacjonarnych, tylko w tym jednym celu.Nie możesz, musi zacząć się od podwyższonych uprawnień. Możesz go ponownie uruchomić za pomocą
runas
czasownika, który poprosi użytkownika o przejście do trybu administratoraEDYCJA: właściwie to nieprawda; HttpListener może działać bez podwyższonych uprawnień, ale musisz nadać uprawnienia do adresu URL, na którym chcesz nasłuchiwać. Zobacz odpowiedź Darrela Millera po szczegóły.
źródło
Jeśli używasz
http://localhost:80/
jako prefiksu, możesz słuchać żądań http bez konieczności posiadania uprawnień administracyjnych.źródło
http://localhost:80/
i otrzymałem komunikat „Odmowa dostępu”.httpListener.Prefixes.Add("http://*:4444/");
rzeczywiście pokazujeAccess Denied
błąd, alehttpListener.Prefixes.Add("http://localhost:4444/");
działa bez problemu. Wygląda na to, że Microsoft został wyłączonylocalhost
z tych ograniczeń. Co ciekawe,httpListener.Prefixes.Add("http://127.0.0.1:4444/");
nadal pokazuje błąd odmowy dostępu, więc jedyne, co działa, tolocalhost:{any port}
Składnia była dla mnie zła, musisz dołączyć cudzysłowy:
w przeciwnym razie otrzymałem komunikat „Parametr jest nieprawidłowy”
źródło
/
Jeśli chcesz użyć flagi „user = Wszyscy”, musisz dostosować ją do języka systemu. W języku angielskim jest jak wspomniano:
W języku niemieckim byłoby to:
źródło
Jako alternatywę, która nie wymaga podniesienia uprawnień ani netsh, możesz również użyć na przykład TcpListener.
Poniżej znajduje się zmodyfikowany fragment tego przykładu: https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthDesktopApp
Metody odczytu i zapisu to:
źródło
new UTF8Encoding(false)
, który wyłącza emisję BOM. Zmieniłem to już w odpowiedziMożesz uruchomić aplikację jako administrator, jeśli dodasz manifest aplikacji do swojego projektu.
Po prostu dodaj nowy element do swojego projektu i wybierz „Plik manifestu aplikacji”. Zmień
<requestedExecutionLevel>
element na:źródło
Domyślnie system Windows definiuje następujący prefiks, który jest dostępny dla wszystkich: http: // +: 80 / Temporary_Listen_Addresses /
Możesz więc zarejestrować się
HttpListener
przez:Prefixes.Add("http://+:80/Temporary_Listen_Addresses/" + Guid.NewGuid().ToString("D") + "/";
Czasami powoduje to problemy z oprogramowaniem takim jak Skype, które domyślnie będzie próbowało używać portu 80.
źródło
używasz "*", więc wykonujesz następujące polecenie cmd jako administrator
nie używaj +, musisz używać *, ponieważ podałeś *: 4444 ~.
https://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
źródło
.Add("http://+:9000/")
Miałem też podobny problem, jeśli już zarezerwowałeś adres URL, musisz najpierw usunąć adres URL, aby uruchomić w trybie innym niż administrator, w przeciwnym razie nie powiedzie się z błędem Odmowa dostępu.
źródło