webdevqa.jp.net

Visual Studio 2017 / IIS Express:構成された開発Webサーバーに接続できません

進行中の作業の保存

Visual Studio 2019(またはVisual Studio 2017、またはVisual Studio 2015)からWebサイトを実行しようとすると、エラーが発生します。

  • Visual Studio 2015:

    enter image description here

    構成された開発用Webサーバーに接続できません。

  • Visual Studio 2017:

    enter image description here

    構成された開発用Webサーバーに接続できません。

    IIS Expressからの出力:
    開始IIS Express ...
    アプリケーション "/"のサイト "WebSite3"のURL " http:// localhost:59392 / "の登録に成功しました
    サイト「WebSite3」の登録が完了しました
    IIS Expressが実行されています。

  • Visual Studio 2019:

    enter image description here

    構成された開発用Webサーバーに接続できません。

    IIS Expressからの出力:Express =開始IIS Express ...正常に登録されたURL " http:// localhost:59392 / "サイト "WebSite3"アプリケーション "/"サイト "WebSite3"の登録が完了しましたIIS Expressが実行中です。

IISExpressisは実際には実行およびリスニングしていますが、実際には何も機能しません。

enter image description here

何を試しましたか- すべて

私が試したもの(Stackoverflowに関する他のすべての質問から):

  • netsh http add urlacl url=http://localhost:56997/ user=everyone
  • 管理者としてVisual Studioを実行する
  • windowsを再起動する
  • 非表示の.vsフォルダを削除する
  • 別のフォルダーからWebサイトを実行する
  • windowsファイアウォールをオフにする
  • webサイトのportを変更する
  • webサイトのportを変更し、Create Virtual Directoryをクリックします
  • IISExpressフォルダーを私のDocumentsフォルダーから削除する
  • visual Studio freshをインストールします(2019年にインストール済み)

IISExpressがリスニングソケットを作成していることがわかります。IISExpress通知領域のアイコンは、IISExpressがWebサイトの実行を検討していることを示しています。

enter image description here

しかし、何にも反応しません。

enter image description here

Bonus Chatter-WindowsビルトインカーネルモードWebサーバー

IISExpress.exeは、リスニングソケット自体を開きません。

Windowsには、カーネルモードのミニWebサーバーhttp.sysが組み込まれています。あなたとIISExpress.exeは、次の呼び出しによってこのWeb Webサーバーを使用します。

//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を超えるポートにアクセス許可を追加する必要はありません。

関連する質問

9
Ian Boyd

私は上記のすべてを絶対に試してみましたが、結局のところ犯人はWindowsファイアウォールでした。

開かれたファイアウォール設定。プライベートファイアウォールとパブリックファイアウォールの両方をオフにしました。 Visual Studioを再起動しました。ビルド。走れ。動作します。

次に、ファイアウォールを再度オンに、段階的に切り替えます。

0
Karlth