Visual Studio 2017 / IIS Express:无法连接到已配置的开发Web服务器

时间:2019-04-23 14:21:12

标签: visual-studio-2015 visual-studio-2017 visual-studio-2019

保存正在进行的工作

当尝试从Visual Studio 2019(或Visual Studio 2017或Visual Studio 2015)运行网站时,出现错误:

  • 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的输出:   启动IIS Express ...   为网站“ WebSite3”应用程序“ /”成功注册了URL“ http://localhost:59392/”   网站“ WebSite3”的注册完成   IIS Express正在运行。

IISExpress 实际上正在运行并正在监听,但实际上没有任何作用:

enter image description here

您尝试了什么-everything

我尝试过的东西(来自Stackoverflow上的所有其他问题):

  • netsh http add urlacl url=http://localhost:56997/ user=everyone
  • 以管理员身份运行Visual Studio
  • 重新启动Windows
  • 删除隐藏的.vs文件夹
  • 从其他文件夹运行网站
  • 关闭Windows防火墙
  • 更改网站的端口
  • 更改网站的端口,然后单击创建虚拟目录
  • 从我的 Documents 文件夹中删除 IISExpress 文件夹
  • 全新安装Visual Studio(我已安装2019)

您可以看到IISExpress正在创建一个侦听套接字,并且IISExpress通知区域图标显示IISExpress认为该网站正在运行:

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

这全部是为了解释为什么系统正在监听,而不是 IISExpress.exe

如果您阅读了注释,您会注意到为什么尝试执行netsh http add urlacl主要是出于货物需求的编程;您不需要为端口超过1024的端口添加权限。

相关问题

5 个答案:

答案 0 :(得分:1)

以我为例,我以nod32智能安全性停止了防火墙并解决了问题!

答案 1 :(得分:1)

转到应用程序属性->调试->应用程序URL检查端口并更改端口并删除Enable SSL中的对勾标记。这对我有用,希望对您有帮助

答案 2 :(得分:0)

我绝对尝试了上面列出的所有内容,最后才是罪魁祸首是Windows防火墙。

已打开防火墙设置。关闭私人和公共防火墙。重新启动Visual Studio。建立。跑。有效。

然后逐步重新打开防火墙。

答案 3 :(得分:0)

我也遇到过同样的问题。但是当我从IIS Express切换到本地IIS(具有项目名称的本地IIS)并又回到IIS Express时,它就解决了

答案 4 :(得分:0)

我在 Windows 10 机器上安装 docker 时遇到了同样的问题。作为副作用,hyper-v 被激活,并且一系列端口不再可用。 在 https://blog.sixthimpulse.com/2019/01/docker-for-windows-port-reservations/

上查看更多信息

我的解决方案是打开“窗口和功能”并禁用 hyper-v

enter image description here

显然,如果您需要运行 hyper-v,您还可以使用以下命令查看被保留的 ip 范围列表:netsh int ipv4 show excludedportrange protocol=tcp 只需将您的项目配置为使用未保留的 IP 地址。