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 . . .

Я запустил монитор ресурсов из вкладки «Производительность диспетчера задач» и увидел, что есть 2 записи о портах прослушивания для 8080.

Оба имеют Image = System, PID = 4, IPv6 не указан, протокол TCP, состояние межсетевого экрана Не разрешено, не ограничено

Я новичок в прослушивании портов, как мне заставить работать код?


person Kirsten Greed    schedule 18.04.2015    source источник
comment
Интересно, нужно ли мне закрыть порт stackoverflow.com/questions/8688949/ Мне нужен хороший справочник по портам и сокетам, чтобы учиться   -  person Kirsten Greed    schedule 18.04.2015
comment
Порты и TCP-трафик youtube.com/watch?v=AXrFCbD4-fU   -  person Kirsten Greed    schedule 18.04.2015


Ответы (4)


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

person shivesh suman    schedule 25.05.2016
comment
Я пробовал это, но получаю эту ошибку ‹< в это время было неожиданно - person Erhan Urun; 08.01.2020
comment
Можете ли вы сделать снимок экрана с тем, что вы напечатали, и опубликовать здесь. Я думаю, одна проблема заключается в том, что текст, который отображается выше, из-за некоторых ограничений форматирования показывает дополнительную пару угловых скобок после url = вы должны указать значение зарезервированного URL (вы можете попробовать одинарные / двойные кавычки вокруг него). Возможно, вы вводите угловые скобки, которые вам не следует вводить. - person shivesh suman; 08.01.2020
comment
Я также отредактировал так, что теперь в примере отображается только одна угловая скобка. Обратите внимание, что использование угловых скобок в примере обычно представляет собой заполнитель для обязательных параметров, и обычно, когда вы указываете значение, вы делаете это без угловых скобок. Обычно таким образом представляют значения заполнителей для аргументов командной строки. - person shivesh suman; 09.01.2020

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

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

person Kirsten Greed    schedule 18.04.2015
comment
Я должен был сначала прочитать это stackoverflow.com/questions/48198/, чтобы использовать netstat -a -b - person Kirsten Greed; 19.04.2015

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

person nihnih    schedule 31.05.2019

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

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

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

person Rahbek    schedule 19.08.2020