進行中の作業の保存
Visual Studio 2019(またはVisual Studio 2017、またはVisual Studio 2015)からWebサイトを実行しようとすると、エラーが発生します。
Visual Studio 2015:
構成された開発用Webサーバーに接続できません。
Visual Studio 2017:
構成された開発用Webサーバーに接続できません。
IIS Expressからの出力:
開始IIS Express ...
アプリケーション "/"のサイト "WebSite3"のURL " http:// localhost:59392 / "の登録に成功しました
サイト「WebSite3」の登録が完了しました
IIS Expressが実行されています。
Visual Studio 2019:
構成された開発用Webサーバーに接続できません。
IIS Expressからの出力:Express =開始IIS Express ...正常に登録されたURL " http:// localhost:59392 / "サイト "WebSite3"アプリケーション "/"サイト "WebSite3"の登録が完了しましたIIS Expressが実行中です。
IISExpressisは実際には実行およびリスニングしていますが、実際には何も機能しません。
私が試したもの(Stackoverflowに関する他のすべての質問から):
netsh http add urlacl url=http://localhost:56997/ user=everyone
.vs
フォルダを削除するIISExpressがリスニングソケットを作成していることがわかります。IISExpress通知領域のアイコンは、IISExpressが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を超えるポートにアクセス許可を追加する必要はありません。
私は上記のすべてを絶対に試してみましたが、結局のところ犯人はWindowsファイアウォールでした。
開かれたファイアウォール設定。プライベートファイアウォールとパブリックファイアウォールの両方をオフにしました。 Visual Studioを再起動しました。ビルド。走れ。動作します。
次に、ファイアウォールを再度オンに、段階的に切り替えます。