Saya menulis server HTTP dalam C #.
Ketika saya mencoba menjalankan fungsi HttpListener.Start()
saya mendapat HttpListenerException
pepatah
"Akses ditolak".
Ketika saya menjalankan aplikasi dalam mode admin di windows 7 berfungsi dengan baik.
Bisakah saya membuatnya berjalan tanpa mode admin? jika ya bagaimana? Jika tidak, bagaimana saya bisa membuat aplikasi berubah ke mode admin setelah mulai berjalan?
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
sumber
sumber
Jawaban:
Ya, Anda dapat menjalankan HttpListener dalam mode non-admin. Yang perlu Anda lakukan adalah memberikan izin ke URL tertentu. misalnya
Dokumentasi ada di sini .
sumber
httpListener.Prefixes.Add("http://*:4444/");
harus sama persis dengan yang ada dinetsh
perintah. Sebagai contoh, saya punyahttpListener.Prefixes.Add("http://127.0.0.1:80/");
dannetsh
perintah yang sama yang Anda miliki, dan HttpListenerException masih akan dibuang. Saya perlu mengubahhttpListener.Prefixes.Add("http://+:80/");
Terima kasih atas bantuan Anda @ Charles Miller, karena Anda membuat saya di jalan yang benar untuk mencari tahu!The parameter is incorrect
kesalahan. Contoh:url=http://+:80/
http://localhost:80/
? Saya memiliki aplikasi desktop yang perlu menerima satu permintaan pada URL seperti itu, dan tampaknya memalukan untuk meminta administrator menginstalnya di 50 desktop, hanya untuk satu tujuan ini.Anda tidak bisa, itu harus dimulai dengan hak istimewa yang ditinggikan. Anda dapat memulai kembali dengan
runas
kata kerja, yang akan meminta pengguna untuk beralih ke mode adminEDIT: sebenarnya, itu tidak benar; HttpListener dapat berjalan tanpa hak yang lebih tinggi, tetapi Anda perlu memberikan izin untuk URL yang ingin Anda dengarkan. Lihat jawaban Darrel Miller untuk detailnya.
sumber
Jika Anda menggunakan
http://localhost:80/
sebagai awalan, Anda dapat mendengarkan permintaan http tanpa perlu hak administratif.sumber
http://localhost:80/
dan mendapat "Akses Ditolak".httpListener.Prefixes.Add("http://*:4444/");
memang menunjukkanAccess Denied
kesalahan tetapihttpListener.Prefixes.Add("http://localhost:4444/");
berfungsi tanpa masalah. Sepertinya Microsoft dikecualikanlocalhost
dari pembatasan ini. Menariknya,httpListener.Prefixes.Add("http://127.0.0.1:4444/");
masih menunjukkan kesalahan Access Denied, jadi satu-satunya yang berfungsi adalahlocalhost:{any port}
Sintaksnya salah untuk saya, Anda harus menyertakan tanda kutip:
kalau tidak saya menerima "Parameter salah"
sumber
/
di urlJika Anda ingin menggunakan flag "user = Everyone" Anda harus menyesuaikannya dengan bahasa sistem Anda. Dalam bahasa Inggris disebutkan:
Di jerman itu adalah:
sumber
Sebagai alternatif yang tidak memerlukan elevasi atau netsh Anda juga bisa menggunakan TcpListener misalnya.
Berikut ini adalah kutipan modifikasi dari sampel ini: https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthDesktopApp
Metode baca dan tulis adalah:
sumber
new UTF8Encoding(false)
, yang menonaktifkan memancarkan BOM. Saya sudah mengubah ini dalam jawabanAnda dapat memulai aplikasi Anda sebagai administrator jika Anda menambahkan Application Manifest ke proyek Anda.
Cukup Tambahkan Item Baru ke proyek Anda dan pilih "File Aplikasi Manifest". Ubah
<requestedExecutionLevel>
elemen menjadi:sumber
Secara default Windows mendefinisikan awalan berikut yang tersedia untuk semua orang: http: // +: 80 / Temporary_Listen_Addresses /
Jadi Anda dapat mendaftarkan Anda
HttpListener
melalui:Prefixes.Add("http://+:80/Temporary_Listen_Addresses/" + Guid.NewGuid().ToString("D") + "/";
Ini terkadang menyebabkan masalah dengan perangkat lunak seperti Skype yang akan mencoba memanfaatkan port 80 secara default.
sumber
Anda menggunakan "*" sehingga Anda menjalankan cmd berikut sebagai admin
tidak ada gunanya +, harus menggunakan *, karena Anda spec *: 4444 ~.
https://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
sumber
.Add("http://+:9000/")
Saya juga menghadapi masalah yang sama. Jika Anda sudah memesan url maka Anda harus terlebih dahulu menghapus url untuk berjalan dalam mode non admin, jika tidak maka akan gagal dengan kesalahan Akses ditolak.
sumber