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

时间:2015-04-18 06:59:13

标签: port owin katana

我正在运行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 . . .

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

两者都有Image = System,PID = 4,未指定IPv6,协议TCP,防火墙状态不允许,不受限制

我是Listening Ports的新手,我如何让代码正常工作?

4 个答案:

答案 0 :(得分:32)

遇到错误时:"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配置为侦听应用程序尝试使用的特定端口。您需要记下&#34;保留网址&#34;的值。该特定应用的字段。稍后您将需要它来删除导致错误的注册。

卸载该特定应用程序 - 假设其卸载过程确实包含取消注册 - 可以解决该问题。或者,您可以采用更直接,更精确的方法来使用该命令删除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时,您会看到网址注册确实消失了。现在运行您的应用程序不应该导致您之前看到的错误。

答案 1 :(得分:1)

我能够通过卸载多个程序来解决问题。 不幸的是我没有在每次测试后进行测试,所以我不知道它是哪一个。

他们包括Dropbox,Goto Assist,Goto Meeting和winforms应用程序

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

import matplotlib.pyplot as plt

epochs = range(1, len(acc) + 1)

plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

记住最后的斜线很重要。否则,您会得到一个错误。