我正在用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;
                }
            }
        }
    }
}

当前回答

我也遇到过类似的问题。如果你已经保留了url,那么你必须首先删除url以非管理模式运行,否则它将失败,访问是拒绝错误。

netsh http delete urlacl url=http://+:80

其他回答

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

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

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

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

谢谢, 这很有帮助。 只是添加更多[从微软页面]:

警告 不应该使用顶级通配符绑定(http://*:8080/和http://+:8080)。顶级通配符绑定可能会导致应用程序存在安全漏洞。这适用于强通配符和弱通配符。使用显式的主机名而不是通配符。子域通配符绑定(例如,*.mysub.com)如果您控制整个父域(与*.com相反,它是易受攻击的)就没有这种安全风险。更多信息请参见rfc7230章节-5.4。

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

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

文档在这里。

不幸的是,由于某些原因可能链接到HTTPS和证书,本机的.NET HttpListener需要管理权限,甚至仅用于HTTP协议…

好的一点是

值得注意的是,HTTP协议位于TCP协议之上,但启动c# TCP侦听器不需要任何管理权限即可运行。换句话说,实现一个不需要管理特权的HTTP服务器在概念上是可能的。

替代

下面是一个不需要管理权限的项目示例: https://github.com/EmilianoElMariachi/ElMariachi.Http.Server

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

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

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