Что вызывает ошибку HttpListener HTTP 503? - PullRequest
14 голосов
/ 16 ноября 2011

Итак, у нас есть большая программа, которая использует HttpListener для небольшой функции удаленного администрирования. По причинам, которые я не понимаю, у некоторых людей возникают проблемы с ошибкой 503.

Так как мы не сообщаем об ошибке, в фреймворке что-то происходит. Теперь мой вопрос: что внутри фреймворка дает эту ошибку? Это то, что префиксы не установлены правильно или что-то?

В настоящее время наш префикс установлен как "http://*:8080/".

Рекомендации

Ответы [ 3 ]

21 голосов
/ 01 февраля 2012

У меня та же ошибка в Windows 7, когда я пытался установить разрешения для HttpListener с помощью команды netsh http. В целевой системе выполните команду (действительно для Windows 7):

netsh http show urlacl    

и проверьте, если ваш URL "http://+:8080/" уже представлен в списке зарезервированных URL. Попробуйте удалить из списка (используя" netsh http delete urlacl ". Подобная тема здесь .

4 голосов
/ 24 ноября 2016

Я немного опоздал на вопрос. Но я только что столкнулся с кодом состояния HTTP 503 в следующем случае:

Если, например, "http://+:8080/MyService/" и " http://+:8080/MyService/SOAP" зарегистрировано с помощью netsh http add urlacl, мы получаем 503 для запросов, направленных на неоднозначный URL. Запросы для "http://myservice:8080/MyService/somethingelse" работали нормально, в то время как запросы для" http://myservice:8080/MyService/SOAP/" не выполнялись со статусом 503.

Добавлено для полноты картины. Мне понадобилось время, чтобы понять.

0 голосов
/ 16 ноября 2018

Убедитесь, что ваши HttpListener и urlacl совпадают.

Запуск слушателя как (C #):

using System;
using System.Net;
using System.ServiceModel;

namespace Example
{
    class MyApi
    {
        private const int _apiPortNumber = 8080;
        public const string BasePath = "/myApi/";
        public static EndpointAddress MyEndPoint => new EndpointAddress(
            new UriBuilder(
                    Uri.UriSchemeHttp,
                    "localhost",//only allow connections on localhost (no remote access)
                    _apiPortNumber,
                    BasePath)
                .Uri);

        public MyApi()
        {
            var httpListener = new System.Net.HttpListener();
            httpListener.Prefixes.Add(MyEndPoint.Uri.ToString());
            httpListener.Start();
        }
    }
}

Что работает как urlacl:

netsh http add urlacl url=http://127.0.0.1:8080/myApi/ user=MyServiceUserName

Однако настройка вашего urlacl следующим образом НЕ будет работать:

http add urlacl url=http://+:8080/myApi/ user=MyServiceUserName

...