web-dev-qa-db-fra.com

Visual Studio 2017 / IIS Express: impossible de se connecter au serveur Web de développement configuré

sauvegarde du travail en cours

Lorsque j'essaie d'exécuter un site Web à partir de Visual Studio 2019 (ou Visual Studio 2017 ou Visual Studio 2015), j'obtiens l'erreur:

  • Visual Studio 2015:

    enter image description here

    Impossible de se connecter au serveur Web de développement configuré.

  • Visual Studio 2017:

    enter image description here

    Impossible de se connecter au serveur Web de développement configuré.

    Sortie de IIS Express:
    Démarrage de IIS Express ...
    URL enregistrée avec succès " http: // localhost: 59392 / " pour le site "WebSite3" dans l'application "/"
    Inscription terminée pour le site "WebSite3"
    IIS Express est en cours d'exécution.

  • Visual Studio 2019:

    enter image description here

    Impossible de se connecter au serveur Web de développement configuré.

    Sortie de IIS Express: Démarrage de IIS Express ... URL enregistrée avec succès " http: // localhost: 59392 / " pour le site "WebSite3" application "/"Inscription terminée pour le site" WebSite3 "IIS Express est en cours d'exécution.

IISExpress est en fait en cours d'exécution et d'écoute, mais rien ne fonctionne réellement:

enter image description here

Qu'avez-vous essayé - tout

Les choses que j'ai essayées (de toutes les autres questions sur Stackoverflow):

  • netsh http add urlacl url=http://localhost:56997/ user=everyone
  • exécuter Visual Studio en tant qu'administrateur
  • redémarrer Windows
  • supprimez le dossier caché .vs
  • exécuter le site Web à partir d'un dossier différent
  • désactiver le pare-feu Windows
  • changer le port du site web
  • modifiez le port du site Web et cliquez sur Créer un répertoire virtuel
  • supprimer le dossier IISExpress de mon dossier Documents
  • installer Visual Studio frais (j'ai installé 2019)

Vous pouvez voir IISExpress créer un socket d'écoute et l'icône de la zone de notification IISExpress indique que IISExpress considère que le site Web fonctionne:

enter image description here

mais cela ne répondra à rien:

enter image description here

Bonus Chatter - Serveur Web en mode noyau intégré à Windows

IISExpress.exe n'ouvre pas lui-même un socket d'écoute.

Windows est livré avec un mini serveur Web intégré en mode noyau: http.sys. Vous et IISExpress.exe utilisez ce serveur Web Web en appelant:

//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/";

Ajoutez l'URL à votre file d'attente de demandes

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

Et puis vous configurez une boucle pour traiter les demandes:

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;
   }      
}

Tout cela est une façon d'expliquer pourquoi c'est le système qui écoute, et non IISExpress.exe .

Et si vous lisez les commentaires, vous remarquerez pourquoi essayer d'exécuter netsh http add urlacl Est principalement une programmation culte; vous n'avez pas besoin d'ajouter des autorisations pour les ports supérieurs à 1024.

Questions connexes

9
Ian Boyd

J'ai essayé absolument tout ce qui est énuméré ci-dessus et, finalement, c'est le pare-feu Windows qui était le coupable.

Paramètres de pare-feu ouverts. Désactivé le pare-feu privé et public. Visual Studio redémarré. Construire. Courir. Travaux.

Réactivez ensuite le pare-feu, étape par étape.

0
Karlth