System.Net.HttpListenerException:无法侦听前缀“http://localhost:8080”

Posted

技术标签:

【中文标题】System.Net.HttpListenerException:无法侦听前缀“http://localhost:8080”【英文标题】:System.Net.HttpListenerException: Failed to listen on prefix 'http://localhost:8080 【发布时间】:2015-04-18 06:59:13 【问题描述】:

我正在从Scott Allen's ASP.Net Fundamentals course 运行以下代码

using System;
using Microsoft.Owin.Hosting;
using Owin;

namespace ConsoleApplication1

    class Program
    
        static void Main(string[] args)
        
            string uri = "http://localhost:8080";
            using (WebApp.Start<Startup>(uri))
            
                Console.WriteLine("Started!");
                Console.ReadKey();
                Console.WriteLine("Stopping!");
            
        
    

    public class Startup
    
        public void Configuration(IAppBuilder app)
        
            app.UseWelcomePage();
            //app.Run(
            //  ctx => ctx.Response.WriteAsync("Hello Owin!"));
        
    

但是,当我运行控制台应用程序时,我会收到一条消息

    Unhandled Exception: System.Reflection.TargetInvocationException: Exception has
been thrown by the target of an invocation. ---> System.Net.HttpListenerExceptio
n: Failed to listen on prefix 'http://localhost:8080/' because it conflicts with
 an existing registration on the machine.
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Microsoft.Owin.Host.HttpListener.OwinHttpListener.Start(HttpListener liste
ner, Func`2 appFunc, IList`1 addresses, IDictionary`2 capabilities, Func`2 logge
rFactory)
   at Microsoft.Owin.Host.HttpListener.OwinServerFactory.Create(Func`2 app, IDic
tionary`2 properties)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments,
 Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Objec
t[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invoke
Attr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.Owin.Hosting.ServerFactory.ServerFactoryAdapter.Create(IAppBuild
er builder)
   at Microsoft.Owin.Hosting.Engine.HostingEngine.StartServer(StartContext conte
xt)
   at Microsoft.Owin.Hosting.Engine.HostingEngine.Start(StartContext context)
   at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions opt
ions)
   at Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions options)
   at Microsoft.Owin.Hosting.WebApp.StartImplementation(IServiceProvider service
s, StartOptions options)
   at Microsoft.Owin.Hosting.WebApp.Start(StartOptions options)
   at Microsoft.Owin.Hosting.WebApp.Start[TStartup](StartOptions options)
   at Microsoft.Owin.Hosting.WebApp.Start[TStartup](String url)
   at ConsoleApplication1.Program.Main(String[] args) in e:\EShared\Dev2015\WebA
ppScottAllen\ConsoleApplication1\ConsoleApplication1\Program.cs:line 12
Press any key to continue . . .

我从任务管理器性能选项卡运行资源监视器,可以看到监听端口上有 2 个条目用于 8080。

两者都有 Image=System, PID=4, IPv6 unspecified, Protocol TCP, Firewall Status Not allowed, not restricted

我是监听端口的新手,如何让代码正常工作?

【问题讨论】:

不知道是否需要关闭端口***.com/questions/8688949/…我需要一个关于端口和套接字的很好的参考来学习 端口和 TCP 流量 youtube.com/watch?v=AXrFCbD4-fU 【参考方案1】:

遇到错误时:"Failed to listen on prefix 'http://someURL:somePortNo/' because it conflicts with an existing registration on the machine." 没有必要有应用程序在该端口上主动侦听 - 因此Netstat -abno 的输出可能并不总是有帮助。如果已经注册的应用程序正在运行,它可以帮助您通过查看 Netstat 提供的信息来确定是哪个应用程序导致了问题。

但是,即使在相关应用程序停止后,您仍会收到此错误,因为该错误表示已注册。因此,正确的诊断命令是:

netsh http show urlacl

我们需要检查输出并检查是否有任何列出的保留 URL 配置为侦听您的应用程序尝试使用的特定端口。您需要注意该特定应用程序的“保留 URL”字段的值。稍后您将需要它来删除导致错误的注册。

卸载该特定应用程序(假设其卸载过程确实包括取消注册)可能会解决问题。或者,您可以采取更直接和更精确的方法来使用删除 URL 保留的命令:

(请注意,如果冲突是合法的,最好将您的应用程序重新配置为侦听不同的端口。)

netsh http delete urlacl url=<value of "Reserved URL" in the output of netsh http show urlacl>

当命令运行时,您将看到输出:URL reservation successfully deleted

在第二次运行netsh http show urlacl 后,您现在将看到 url 注册确实消失了。现在运行您的应用程序不应导致您之前看到的错误。

【讨论】:

我试过了,但收到了这个错误 您能否截取您输入的内容并在此处发布。我认为一个问题是,由于某些格式限制,上面显示的文本显示了额外的尖括号对,在 url= 之后,您应该提供保留 URL 的值(您可以尝试使用单引号/双引号)。您可能正在输入不应该输入的尖括号。 我还进行了编辑,现在示例中只显示了一个尖括号。请注意,在示例中使用尖括号通常表示所需参数的占位符,并且通常当您提供值时,您会在没有任何尖括号的情况下执行此操作。以这种方式为命令行参数提供占位符值是很常见的。【参考方案2】:

我可以通过卸载几个程序来解决这个问题。 不幸的是,我没有在每个之后都进行测试,所以我不知道它是哪一个。

其中包括 Dropbox、Goto Assist、Goto Meeting 和一个 winforms 应用程序

【讨论】:

我应该先阅读***.com/questions/48198/… 以使用 netstat -a -b【参考方案3】:

我遇到了同样的问题,这是一个愚蠢的解决方案。我打开了其他使用相同端口号的控制台应用程序,因此在关闭所有控制台应用程序后,我能够运行并且没有收到此错误。

【讨论】:

【参考方案4】:

我在 Visual Studio 中遇到了同样的错误,这足以告诉我哪个端口出错了。然后我在管理员命令提示符中运行了这个命令:

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

注意:记住最后的斜线很重要。否则会报错。

【讨论】:

以上是关于System.Net.HttpListenerException:无法侦听前缀“http://localhost:8080”的主要内容,如果未能解决你的问题,请参考以下文章