System.Net.HttpListenerException: не удалось прослушать префикс http://localhost:8080

Я запускаю следующий код из курса ASP.Net Основы Скотта Аллена

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 не указан, Protocol TCP, Состояние брандмауэра Не ​​разрешено, не ограничено

Я новичок в Listening Ports, как мне заставить работать код?

2 ответа

Решение

Когда сталкиваются с ошибкой: "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 действительно прошла. И теперь запуск вашего приложения не должен приводить к ошибке, которую вы видели ранее.

У меня была та же проблема, и это было глупое решение. У меня были открыты другие консольные приложения, которые использовали тот же номер порта, поэтому после закрытия всех консольных приложений я смог запустить и не получил эту ошибку.

Я смог решить проблему, удалив несколько программ. К сожалению, я не проверял после каждого, поэтому я не знаю, какой это был.

Они включали Dropbox, Goto Assist, Goto Meeting и приложение winforms

У меня была такая же ошибка в Visual Studio, которая была достаточно любезна, чтобы сказать мне, какой порт был неправильным. Затем я запустил эту команду в командной строке администратора:

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

Важно помнить о последней косой черте. В противном случае вы получите ошибку.

Другие вопросы по тегам