Собственный проект OWIN;http://localhost:8080 не будет работать, http://+:8080 работает? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть собственный проект OWIN, который я пытаюсь запустить.Он настроен на прослушивание:

http://localhost:8080

Каждый раз, когда я пытаюсь получить доступ к этому URL, я получаю HTTP-ошибку 503. Служба недоступна ошибка.

Я запустил netstat -a -b и абсолютно уверен, что на порте 8080 не работает другое приложение.

Когда я изменяю конфигурацию на http://+:8080, проект работает нормально.Таким образом, единственное изменение - localhost к +.

Теперь вот странные вещи:

  • Я убедился, что все записи (localhost:8080 или +:8080) в пространстве имен HTTP идентичны (см. , и , , где «iedereen» является голландским для «всех» (и, да, это только на моей тестовой станции)),Соответствующий вывод netsh http show urlacl:

    URL Reservations: 
    
    Reserved URL            : http://+:8080/ 
        User: \Everyone
            Listen: Yes
            Delegate: Yes
            SDDL: D:(A;;GAGXGWGR;;;WD) 
    
    Reserved URL            : http://localhost:8080/ 
        User: \Everyone
            Listen: Yes
            Delegate: Yes
            SDDL: D:(A;;GAGXGWGR;;;WD) 
    
  • У меня такая же проблема на порте 8081 или других портах;«+» работает, «localhost» - нет.Поэтому, чтобы убедиться, что с 8080 не было ничего конфликтующего, я попробовал 8081 (и другие порты, и, конечно же, с правильными urlacl)

  • Когда я использую +:8080, приложение может бытьдостиг хорошо;Я получаю желаемый ответ.Так что это не проблема брандмауэра.И не для порта 8081 или других портов, которые я пробовал.Кроме того, 503 исходит из приложения (в конце концов, это ошибка приложения, но также: когда я останавливаю приложение, я просто не получаю ответа вместо 503), поэтому, опять же, проблема с брандмауэром.
  • Я попытался запустить от имени администратора безрезультатно, то же самое для запуска VS от имени администратора.
  • localhost:8080 работает на компьютере коллеги (именно так все и было)
  • localhost разрешает в порядке 127.0.0.1 и ::1.Файл измененных хостов отсутствует.

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

Хорошо, к тестовому коду для воспроизведения:

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

namespace TestApp
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            using (WebApp.Start<WebAppStartup>("http://localhost:8080"))
            {
                Console.WriteLine("Press [enter] to quit...");
                Console.ReadLine();
            }
        }
    }

    internal class WebAppStartup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello, world.");
            });
        }
    }
}

Опять же, вышеописанное не работает , если я не изменю localhostна +.

Мой главный вопрос : есть ли способ отладить это?Я не получаю никаких исключений при запуске приложения, но метод контроллера никогда не достигается (или: в приведенном выше коде «Hello, world» никогда не возвращается).Я проверил журнал событий Windows, но там ничего нет.

Примечание. Моя проблема на самом деле не является проблемой (поскольку у меня есть «обходной путь»);когда я просто изменяю конфигурацию для использования http://+:8080 , но на данный момент это принципиальный вопрос, и я хотел бы знать , почему + работает, а localhost не работаетt.

Меня больше всего интересует, как это отладить и в чем разница между localhost и +;как настроить OWIN или где установить точку останова, чтобы увидеть, как поступает запрос, или как отправляется ответ 503, или как записать это в журнал или ...


Редактировать: я изменил код напрочитайте:

using Microsoft.Owin;
using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.Threading.Tasks;

namespace TestApp
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            using (WebApp.Start<WebAppStartup>("http://localhost:8080/"))   // or: http://+:8080/
            {
                Console.WriteLine("Press [enter] to quit...");
                Console.ReadLine();
            }
        }
    }

    internal class WebAppStartup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Use<TestMiddleware>();

            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                Console.WriteLine("Sending response");
                return context.Response.WriteAsync("Hello, world.");
            });
        }
    }

    public class TestMiddleware : OwinMiddleware
    {
        public TestMiddleware(OwinMiddleware next) : base(next) { }

        public override async Task Invoke(IOwinContext context)
        {
            Console.WriteLine("Begin Request");
            await Next.Invoke(context);
            Console.WriteLine("End Request");
        }
    }
}

Когда я запускаю приложение с http://+:8080, я вижу, что в моей консоли появляется следующее:

Begin Request
Sending response
End Request

А также в моем браузере появляется «Hello, world».Я могу установить точку останова в строке «начать запрос», и она попадет.Затем я снова изменяю на http://localhost:8080 и ... HTTP Error 503. The service is unavailable..Снова.Консоль ничего не показывает (кроме очевидного «Нажмите [enter], чтобы выйти ...»), точка останова не достигнута.

...