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

当前回答

如果将应用程序清单添加到项目中,则可以以管理员身份启动应用程序。

只需添加新项目到您的项目,并选择“应用程序清单文件”。将<requestedExecutionLevel>元素更改为:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

其他回答

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

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

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

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

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

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

文档在这里。

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

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

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

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

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