Funkcja PathIsDirectory może zostać zablokowana, gdy zostanie wywołana przy użyciu nazwy serwera UNC z ukośnikiem odwrotnym

Ten artykuł ułatwia rozwiązanie PathIsDirectory problemu, w którym funkcja może zostać zablokowana, gdy jest wywoływana przez aplikacje korzystające z nazwy serwera UNC, która zawiera kreskę odwrotną.

Oryginalna wersja produktu:   Windows SDK dla Windows 10
Oryginalny numer KB:   4525162

Symptomy

PathIsDirectory Aplikacje wywołujące tę funkcję mogą zablokować wątek połączenia na maksymalnie dwie minuty po nawiązyniu połączenia przy użyciu nazwy serwera UNC (Universal Naming Convention) z ukośnikiem odwrotnym, na przykład: \\servername\.

Przyczyna

Aplikacja blokująca wątek PathIsDirectory połączenia może mieć stos połączenia podobny do następującego:

0:000> kn
# Child-SP RetAddr Call Site
00 0000006f94f48ba33b59f108 00007ffc ntdll! ZwWaitForSingleObject+0x14
01 0000006f8eebb3033b59f110 00007ffc KERNELBASE! WaitForSingleObjectEx+0x93
02 (funkcja w tekście) ---------------- WINHTTP! HTTP_USER_REQUEST::_HandleSyncPending+0x2d
03 0000006f8eec9a853b59f1b0 00007ffc WINHTTP! HTTP_USER_REQUEST::SendRequest+0x3f3
04 0000006f8afff4fe3b59f2b0 00007ffc WINHTTP! WinHttpSendRequest+0x585
05 0000006f8b0001353b59f410 00007ffc davclnt! DavDoesServerDoDav+0x4ba
06 0000006f8affc2fa3b59f4f0 00007ffc davclnt! DavShouldStartWebclientService+0x2f9
07 0000006f70b8e8513b59f570 00007ffc davclnt! NPGetResourceInformation+0x23a
08 0000006f70b8c7d53b59f610 00007ffc MPR! CGetResourceInformation::TestProvider+0x21
09 0000006f70b8c9fd3b59f650 00007ffc MPR! CRoutedOperation::GetResult+0x135
0a 0000006f70b8ca693b59f6d0 00007ffc MPR! CMprOperation::P formularz+0x4d
0b 0000006f70b8e9bf3b59f710 00007ffc MPR! CRoutedOperation::P erform+0x29
0c 0000006f956ed27c3b59f740 00007ffc MPR! WNetGetResourceInformationW+0x4f
0d 0000006f226f292e3b59f7d0 00007ff7 SHLWAPI! PathIsDirectoryW+0x60fc

Dzieje się tak, WNetGetResourceInformation gdy funkcja jest wywoływana w celu uzyskania informacji o określonym serwerze. W tym stosie wywołań biblioteka DLL (dll) dostawcy sieci Web DAV (DAVCLNT.DLL) blokuje wątek połączenia podczas oczekiwania, aż określony serwer odpowie na żądanie HTTP. Upłynie do dwóch minut. Wątek połączeń zostanie zablokowany do czasu, aż serwer odpowie na żądanie HTTP lub do przeoczy przeoczy.

Rozwiązanie

Aplikacje mogą uniknąć tego scenariusza, jeśli przed nazwą UNC zostanie wywołany następujący ukośnik odwrotny UNC: . \\servername

Możesz również wyłączyć usługę WebClient lub skonfigurować ją tak, aby nie opóźniało się w żądaniu HTTP, które zostało wykonane przez dostawcę sieci Web DAV.