Visual Studio 2017 / IIS Express: невозможно подключиться к настроенному веб-серверу разработки - PullRequest
5 голосов
/ 23 апреля 2019

сохранение текущей работы

При попытке запустить веб-сайт из Visual Studio 2019 (или Visual Studio 2017, или Visual Studio 2015) я получаю сообщение об ошибке:

  • Visual Studio 2015:

    enter image description here

    Невозможно подключиться к настроенномуВеб-сервер разработки.

  • Visual Studio 2017:

    enter image description here

    Невозможно подключиться к настроенному веб-серверу разработки.

    Вывод из IIS Express:
    Запуск IIS Express ...
    Успешно зарегистрированный URL-адрес "http://localhost:59392/" для сайта" WebSite3"в приложении" / "
    Регистрация завершена для сайта" WebSite3 "
    IIS Express работает.

  • Visual Studio 2019:

    enter image description here

    Невозможно подключиться к настроенному веб-серверу разработки.

    Вывод из IIS Express: запуск IIS Express ...Успешно зарегистрировалсяURL "http://localhost:59392/" для приложения" WebSite3 "сайта" / "Регистрация IIS Express завершена для сайта" WebSite3 ".

IISExpress is на самом деле работает и слушает, но на самом деле ничего не работает:

enter image description here

Что вы пробовали - все

Вещи, которые я пробовал (из любого другого вопроса о Stackoverflow):

  • netsh http add urlacl url=http://localhost:56997/ user=everyone
  • запустить Visual Studio от имени администратора
  • перезагрузить Windows
  • удалить скрытую папку .vs
  • запустить веб-сайт из другой папки
  • отключить брандмауэр Windows
  • изменить порт веб-сайта
  • измените порт веб-сайта и нажмите Создать виртуальный каталог
  • удалить IISExpress папка из моих документов папка
  • установка Visual Studio fresh (я установил 2019)

Вы можете увидеть IISExpresсоздает сокет прослушивания, а значок области уведомлений IISExpress показывает, что IISExpress считает, что веб-сайт работает:

enter image description here

, но он просто не отвечаетчто-нибудь:

enter image description here

Bonus Chatter - встроенный в Windows веб-сервер в режиме ядра

IISExpress.exe не открывает сам прослушивающий сокет,

Windows поставляется со встроенным мини-веб-сервером в режиме ядра: http.sys.Вы и IISExpress.exe используете этот веб-сервер по телефону:

//Initialize HTTP Server APIs
HttpInitialize(HTTPAPI_VERSION_1_0, HTTP_INITIALIZE_SERVER, null);

//Create a Request Queue
HANDLE requestQueue;
HttpCreateHttpHandle(ref requestQueue, 0);

/*
   Add URIs to listen on. We call HttpAddUrl for each URI.
   The URI is a fully qualified URI and must include the terminating (/) character.

   The IANA port numbers state ports 49152-65535 are for dynamic/private purposes.
   HttpAddUrl for localhost on a port >= 49152 works fine for non-admins.
*/
String url = "http://localhost:80/"; //Ports 1-1024 require administrator access

/*
   You can use netsh to modify the HttpServer api ACL to grant everyone acces s to port 80:

      netsh http add urlacl url=http://localhost:80/ user=EVERYONE listen=yes delegate=no

   But it is useful to note that WCF already has an "Everyone Allow" entry for port 80,
   as long as your URL starts with "/Temporary_Listen_Addresses/"

   WCF creates URLs of the form:

      http://+80/Temporary_Listen_Address/[random guid]/
*/
url = "http://+:80/Temporary_Listen_Addresses/{87CB7BDF-A52D-4496-AA1D-B6F60AC2841E}/"; //WCF style url

//Or we can just use one above 1024
url = "http://localhost:2113/";

Добавьте URL-адрес в очередь запросов

//Add the url to our request queue    
ret = HttpAddUrl(requestQueue, url, null);

И затем вы настраиваете цикл для обработкизапросы:

while (true)
{
   THTTP_REQUEST_ID requestID;
   Int32 requestBufferLength = sizeof(THTTP_REQUEST) + 16384;
   PHTTP_REQUEST request = GetMemory(requestBufferLength );
   DWORD bytesRead;

   ULONG res = HttpReceiveHttpRequest(requestQueue, 
                requestId,          // Req ID
                0,                  // Flags
                request,            // HTTP request buffer
                requestBufferLength,// req buffer length
                ref bytesRead,      // bytes received
                null                // LPOVERLAPPED
                );
   if (res == NO_ERROR)
   {
      res = SendHttpResponse(requestQueue, request, 451, "Totally not NSL", "I don't know what you mean ;)");
      if (res <> NO_ERROR) 
         break;

      // Reset the Request ID to handle the next request.
      requestID = 0;
   }
   else if (res == ERROR_MORE_DATA)
   {
      /*
         The input buffer was too small to hold the request headers.
         Increase the buffer size and call the API again.

         When calling the API again, handle the request that failed by passing a RequestID.
         This RequestID is read from the old buffer.
      */
      requestId = request.RequestId;

      //Free the old buffer and allocate a new buffer.
      requestBufferLength  = bytesRead;
      FreeMem(request);
      request = GetMemory(requestBufferLength);
   }
   else if ((result == ERROR_CONNECTION_INVALID) and (requestID <> 0)) 
   {
      /*
            The TCP connection was corrupted by the peer when attempting to handle a request with more buffer.
            Continue to the next request.
      */
      //Got invalid connection error
      requestID := 0;
   }
   else
   {
      // Other unhandled error; stopping processing requests
      break;
   }      
}

Все это для объяснения, почему System прослушивает, а не IISExpress.exe .

И если вы прочтете комментарии, вы заметите, почему попытка выполнить netsh http add urlacl является в основном карго-культовым программированием;вам не нужно добавлять разрешения для портов более 1024.

Смежные вопросы

...