我正在用c#编写一个HTTP服务器。

当我尝试执行函数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;
                }
            }
        }
    }
}

当前回答

语法对我来说是错误的,你必须包括引号:

netsh http add urlacl url="http://+:4200/" user=everyone

否则我收到“参数不正确”

其他回答

我可以让它在没有管理模式的情况下运行吗?如果是,怎么做?如果不是,我怎么能使应用程序更改为管理模式后开始运行?

你不能,必须从更高的特权开始。您可以使用runas谓词重新启动它,这将提示用户切换到管理模式

static void RestartAsAdmin()
{
    var startInfo = new ProcessStartInfo("yourApp.exe") { Verb = "runas" };
    Process.Start(startInfo);
    Environment.Exit(0);
}

编辑:事实上,这不是真的;HttpListener可以在没有提升权限的情况下运行,但是您需要为希望侦听的URL授予权限。详见达雷尔·米勒的回答。

如果你想使用“user=Everyone”标志,你需要根据你的系统语言来调整它。在英语中,如前所述:

netsh http add urlacl url=http://+:80/ user=Everyone

在德语中是:

netsh http add urlacl url=http://+:80/ user=Jeder

是的,你可以在非管理模式下运行HttpListener。您所需要做的就是将权限授予特定的URL。如。

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\user

文档在这里。

httpListener.Prefixes.Add("http://*:4444/");

您使用“*”,因此您以管理员身份执行CMD

netsh http add urlacl url=http://*:4444/ user=username

没有使用+,必须使用*,因为您规范*:4444~。

https://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx

语法对我来说是错误的,你必须包括引号:

netsh http add urlacl url="http://+:4200/" user=everyone

否则我收到“参数不正确”