ไม่มีไดเร็กทอรี ชื่อพารามิเตอร์: directoryVirtualPath


115

ฉันเพิ่งเผยแพร่โครงการของฉันไปยังโฮสต์ของฉันบน Arvixe และได้รับข้อผิดพลาดนี้ (ใช้งานได้ดีในพื้นที่):

Server Error in '/' Application.

Directory does not exist.
Parameter name: directoryVirtualPath

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentException: Directory does not exist.
Parameter name: directoryVirtualPath

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[ArgumentException: Directory does not exist.
Parameter name: directoryVirtualPath]
   System.Web.Optimization.Bundle.IncludeDirectory(String directoryVirtualPath, String searchPattern, Boolean searchSubdirectories) +357
   System.Web.Optimization.Bundle.Include(String[] virtualPaths) +287
   IconBench.BundleConfig.RegisterBundles(BundleCollection bundles) +75
   IconBench.MvcApplication.Application_Start() +128

[HttpException (0x80004005): Directory does not exist.
Parameter name: directoryVirtualPath]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +9160125
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +131
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +194
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +339
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +253

[HttpException (0x80004005): Directory does not exist.
Parameter name: directoryVirtualPath]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9079228
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +256

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.237

หมายความว่าอย่างไร?

คำตอบ:


229

ฉันประสบปัญหาเดียวกันและพบว่าฉันมีชุดข้อมูลบางชุดที่ชี้ไปที่ไฟล์ที่ไม่มีการออกจากไฟล์โดยใช้ {version} และ * สัญลักษณ์แทนเช่น

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
    "~/Scripts/jquery-{version}.js"));

ฉันลบออกทั้งหมดและข้อผิดพลาดก็หายไป


2
ไม่แน่ใจว่าสิ่งนี้ "คลุมเครือ" หรือหายากเพียงใด stacktrace จะชี้ให้คุณรับBundleConfig.RegisterBundlesสายโดยตรงจากApplication_Start+1 ของฉันจะไปที่คำตอบของ @ user2465004 แทน
CrazyPyro

3
ฉันได้รับข้อผิดพลาดเดียวกันเนื่องจาก / scripts / โฟลเดอร์ที่อ้างถึงในบันเดิลของฉันไม่มีอยู่บนเซิร์ฟเวอร์ของฉัน
user1616625

ฉันแปลงโครงการ asp.net mvc เป็น web api และไม่ได้ใช้ไฟล์ jquery, css เลย ดีใจที่พบโพสต์ของคุณ แก้ไขแล้วและทุกอย่างทำงานได้ดี
แซม

3
นอกจากนี้เมื่อเผยแพร่ไปยัง Azure ดูเหมือนว่าจะไม่อนุญาตให้คุณเผยแพร่โฟลเดอร์เปล่า ฉันมีคำสั่ง .IncludeDirectory ("~ / Scripts / Create / Controllers", "* .js") และในขณะที่โฟลเดอร์ Controllers มีอยู่จริง แต่ก็ยังไม่มีอะไรอยู่ในนั้นและทำให้เกิดข้อผิดพลาดเดียวกัน ฉันแค่ใส่ไฟล์ข้อความเปล่าลงในโฟลเดอร์แล้วมันก็ใช้งานได้
RamblerToning

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันมีไดเร็กทอรีว่างที่รวมอยู่ในการกำหนดค่าบันเดิลของฉันซึ่งฉันวางแผนที่จะเพิ่มไฟล์ในอนาคต ทุกอย่างดีขึ้นในเครื่องเพราะมีไดเรกทอรีเหล่านั้นอยู่ แต่เมื่อฉันดันไปที่ Azure พวกเขาไม่ได้ถูกสร้างขึ้น
JMK

16

ฉันมีปัญหาเดียวกันนี้และไม่ใช่ปัญหาเกี่ยวกับรหัส ฉันใช้ตัวเลือกการเผยแพร่ (ไม่ใช่ FTP) และ Visual Studio ไม่ได้อัปโหลดสคริปต์ / css ของฉันไปยังเซิร์ฟเวอร์ azure เนื่องจากไม่ได้ "รวมอยู่ในโครงการของฉัน" ดังนั้นในเครื่องมันก็ใช้งานได้ดีเพราะมีไฟล์อยู่ในฮาร์ดไดรฟ์ของฉัน สิ่งที่แก้ไขปัญหานี้ในกรณีของฉันคือ "โครงการ> แสดงไฟล์ทั้งหมด ... " และคลิกขวาที่ไฟล์ที่ไม่ได้รวมไว้รวมเข้าด้วยกันและเผยแพร่อีกครั้ง


+1 นี่เป็นคำตอบที่ดีกว่าคำตอบที่ได้รับการยอมรับมากและควรจะรวมเข้าด้วยกัน เนื่องจากสิ่งแรกที่ต้องทำเพื่อตอบสนองต่อ "file / directory not found" จึงต้องตรวจสอบว่ามีอยู่แล้ว แต่ในสถานการณ์นี้มันค่อนข้างน่ากลัวกว่าเพราะคุณตรวจสอบและมีอยู่ในเครื่องไม่ใช่บนเซิร์ฟเวอร์ สำหรับสถานการณ์ที่เลวร้ายยิ่งขึ้นโปรดดูคำตอบของฉัน
CrazyPyro

ฉันยังมีปัญหานี้ การปรับใช้จากกล่องในเครื่องของฉันใช้งานได้ แต่จากเซิร์ฟเวอร์สร้างมันไม่ได้ ปรากฎว่าบิลด์เซิร์ฟเวอร์ไม่รวมไฟล์. js ที่สร้างโดยคอมไพลเลอร์ TypeScript ในแพ็คเกจ น่าจะเป็นเครื่องมือ TypeScript เวอร์ชันเก่าบนบิลด์เซิร์ฟเวอร์ ในการแก้ไขอย่างรวดเร็วฉันรวมไฟล์. js ไว้ในโปรเจ็กต์
กระตุ้น

สำหรับฉันมันเป็นปัญหากับ BitTorrent Sync ที่ใช้ในการปรับใช้ไฟล์ ไฟล์บางไฟล์ไม่ได้รับการปรับใช้เนื่องจากความผิดพลาดบางประการ ..
Filip

10

นี่คือชั้นเรียนสั้น ๆ ที่ฉันเขียนขึ้นเพื่อให้ง่ายขึ้น

using System.Web.Hosting;
using System.Web.Optimization;

// a more fault-tolerant bundle that doesn't blow up if the file isn't there
public class BundleRelaxed : Bundle
{
    public BundleRelaxed(string virtualPath)
        : base(virtualPath)
    {
    }

    public new BundleRelaxed IncludeDirectory(string directoryVirtualPath, string searchPattern, bool searchSubdirectories)
    {
        var truePath = HostingEnvironment.MapPath(directoryVirtualPath);
        if (truePath == null) return this;

        var dir = new System.IO.DirectoryInfo(truePath);
        if (!dir.Exists || dir.GetFiles(searchPattern).Length < 1) return this;

        base.IncludeDirectory(directoryVirtualPath, searchPattern);
        return this;
    }

    public new BundleRelaxed IncludeDirectory(string directoryVirtualPath, string searchPattern)
    {
        return IncludeDirectory(directoryVirtualPath, searchPattern, false);
    }
}

ในการใช้งานให้แทนที่ ScriptBundle ด้วย BundleRelaxed ในโค้ดของคุณดังใน:

        bundles.Add(new BundleRelaxed("~/bundles/admin")
            .IncludeDirectory("~/Content/Admin", "*.js")
            .IncludeDirectory("~/Content/Admin/controllers", "*.js")
            .IncludeDirectory("~/Content/Admin/directives", "*.js")
            .IncludeDirectory("~/Content/Admin/services", "*.js")
            );

2
ตัวอย่างที่ดี - เฉพาะ gotcha ที่นี่เท่านั้นที่HostingEnvironment.MapPathไม่ได้คำนึงถึงBundleTable.VirtualPathProviderส่วนขยายที่คุณอาจใช้อยู่ ( อาจไม่ใช่ค่าเริ่มต้นและไม่ใช่HostingEnvironment.VirtualPathProvider ) สำหรับกรณีนี้คุณจะต้องการแปลงตัวอย่างข้างต้นกับการใช้งานและBundleTable.VirtualPathProvider.DirectoryExists การค้นหารูปแบบไฟล์กลายเป็นปัญหามากขึ้นเล็กน้อย แต่เป็นจุดเริ่มต้นที่ดี BundleTable.VirtualPathProvider.GetDirectory
SliverNinja - MSFT

สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้ ยังไม่ทราบว่ากลุ่มที่กระทำผิดคือใคร ขอบคุณสำหรับตัวอย่างโค้ดอันทรงพลังนี้คุณช่วยฉันจากการซ้ำเติมในบ่ายวันนี้
Don Rolling

3

ฉันพบปัญหาเดียวกันในวันนี้ซึ่งจริงๆแล้วฉันพบว่าไฟล์บางไฟล์ภายใต้ ~ / Scripts ไม่ได้รับการเผยแพร่ ปัญหาได้รับการแก้ไขหลังจากที่ฉันเผยแพร่ไฟล์ที่หายไป


2

ฉันยังได้รับข้อผิดพลาดนี้ด้วยการมีไดเร็กทอรีที่ไม่มีอยู่จริงในไฟล์ bundles.config ของฉัน การเปลี่ยนสิ่งนี้:

<?xml version="1.0"?>
<bundleConfig ignoreIfDebug="true" ignoreIfLocal="true">
    <cssBundles>
        <add bundlePath="~/css/shared">
            <directories>
                <add directoryPath="~/content/" searchPattern="*.css"></add>
            </directories>
        </add>
    </cssBundles>
    <jsBundles>
        <add bundlePath="~/js/shared">
            <directories>
                <add directoryPath="~/scripts/" searchPattern="*.js"></add>
            </directories>
            <!--
            <files>
                <add filePath="~/scripts/jscript1.js"></add>
                <add filePath="~/scripts/jscript2.js"></add>
            </files>
            -->
        </add>
    </jsBundles>
</bundleConfig>

สำหรับสิ่งนี้:

<?xml version="1.0"?>
<bundleConfig ignoreIfDebug="true" ignoreIfLocal="true">
    <cssBundles>
    </cssBundles>
    <jsBundles>
    </jsBundles>
</bundleConfig>

แก้ปัญหาให้ฉัน


2

เช่นเดียวกับ @JerSchneid ปัญหาของฉันคือไดเร็กทอรีว่างเปล่า แต่กระบวนการปรับใช้ของฉันแตกต่างจาก OP ฉันกำลังทำการปรับใช้โดยใช้ git บน Azure (ซึ่งใช้ Kudu) และไม่ทราบว่า git ไม่มีไดเร็กทอรีว่างใน repo ดูhttps://stackoverflow.com/a/115992/1876622

โครงสร้างโฟลเดอร์ในเครื่องของฉันคือ:

[Project Root] / Content / jquery-plugins // มีไฟล์

[Project Root] / Scripts / jquery-plugins // มีไฟล์

[Project Root] / Scripts / misc-plugins // โฟลเดอร์ว่าง

ในขณะที่การโคลน / ดึงที่เก็บของฉันบนเซิร์ฟเวอร์ระยะไกลไม่ได้รับไดเร็กทอรีว่าง:

[Project Root] / Content / jquery-plugins // มีไฟล์

[Project Root] / Scripts / jquery-plugins // มีไฟล์

แนวทางที่ดีที่สุดในการแก้ไขปัญหานี้คือการสร้างไฟล์. keep ในไดเร็กทอรีว่าง ดูโซลูชัน SO นี้: https://stackoverflow.com/a/21422128/1876622


2

ฉันมีปัญหาเดียวกัน ปัญหาในกรณีของฉันคือโฟลเดอร์ของสคริปต์ที่มีสคริปต์ bootstrap / jqueries ทั้งหมดไม่อยู่ในโฟลเดอร์ wwwroot เมื่อฉันเพิ่มโฟลเดอร์ของสคริปต์ไปยัง wwwroot ข้อผิดพลาดก็หายไป


1

นอกจากนี้ยังอาจเกิดจากสภาพการแข่งขันขณะปรับใช้:

หากคุณใช้ "เผยแพร่" ของ Visual Studio เพื่อปรับใช้กับการแชร์ไฟล์บนเครือข่ายและเลือก "ลบไฟล์ที่มีอยู่ทั้งหมดก่อนที่จะเผยแพร่" (ฉันทำเช่นนี้ในบางครั้งเพื่อให้แน่ใจว่าเรายังคงไม่รู้ตัวขึ้นอยู่กับไฟล์ที่ถูกลบออกจากโปรเจ็กต์ แต่ยังคงค้างอยู่บนเซิร์ฟเวอร์)

หากมีคนเข้าชมไซต์ก่อนที่ไฟล์ JS / CSS ที่จำเป็นทั้งหมดจะถูกปรับใช้อีกครั้งไซต์จะเริ่มทำงานApplication_StartและRegisterBundlesจะไม่สามารถสร้างบันเดิลได้อย่างถูกต้องและทำให้เกิดข้อยกเว้นนี้

แต่เมื่อคุณได้รับข้อยกเว้นนี้และไปตรวจสอบเซิร์ฟเวอร์ไฟล์ที่จำเป็นทั้งหมดจะอยู่ในที่ที่ควรจะเป็น!

อย่างไรก็ตามแอปพลิเคชันยังคงให้บริการไซต์อย่างมีความสุขโดยสร้าง 404 สำหรับคำขอบันเดิลใด ๆ พร้อมกับเพจที่ไม่ได้จัดเรียง / ไม่ทำงานซึ่งเป็นผลมาจากสิ่งนี้และไม่เคยพยายามสร้างบันเดิลใหม่แม้ว่าไฟล์ JS / CSS ที่จำเป็นจะพร้อมใช้งานแล้วก็ตาม

การปรับใช้ใหม่โดยใช้ "แทนที่ไฟล์ที่ตรงกันด้วยสำเนาในเครื่อง" จะทำให้แอปเริ่มต้นใหม่และลงทะเบียนชุดรวมอย่างถูกต้องในครั้งนี้


1

นี่อาจเป็นปัญหาเก่าฉันมีข้อผิดพลาดที่คล้ายกันและในกรณีของฉันคือโฟลเดอร์ Scripts ที่ซ่อนอยู่ในโฟลเดอร์ Models ของฉัน Stack trace บอกอย่างชัดเจนว่า Directory ที่ขาดหายไปและโดยค่าเริ่มต้น Java Scripts ทั้งหมดควรอยู่ใน Scripts Folder สิ่งนี้อาจไม่สามารถใช้ได้กับผู้ใช้ข้างต้น


1

ฉันได้สร้างAngularแอปพลิเคชันใหม่และเขียน

bundles.Add(new ScriptBundle("~/bundles/app")
    .IncludeDirectory("~/Angular", "*.js")
    .IncludeDirectory("~/Angular/directives/shared", "*.js")
    .IncludeDirectory("~/Angular/directives/main", "*.js")
    .IncludeDirectory("~/Angular/services", "*.js"));

แต่ฉันไม่ได้สร้างขึ้นservicesดังนั้นservicesโฟลเดอร์จึงไม่ถูกนำไปใช้ในการเผยแพร่เนื่องจากมันว่างเปล่า น่าเสียดายที่คุณต้องใส่ไฟล์ดัมมี่ไว้ในโฟลเดอร์ว่างใด ๆ เพื่อเผยแพร่

https://blogs.msdn.microsoft.com/webdevelopertips/2010/04/29/tip-105-did-you-know-how-to-include-empty-directory-when-package-a-web-application/


1

ฉันก็ประสบปัญหาเดียวกันเช่นกัน เรียกดูเส้นทางไฟล์ภายใต้ Script Folder คัดลอกชื่อไฟล์ที่แน่นอนและทำการเปลี่ยนแปลงใน bundle.cs:

รหัสเก่า: //Bundle.cs

public class BundleConfig

{

    public static void RegisterBundles(BundleCollection bundles)

    {

        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-{version}.js"));

        bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.validate*"));

        bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                    "~/Scripts/modernizr-*"));

    }
}

รหัสใหม่:

public class BundleConfig

{

      public static void RegisterBundles(BundleCollection bundles)

      {

        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-1.10.2.js"));

        bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.validate.js"));

        bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                    "~/Scripts/modernizr-2.6.2.js"));
      }
}

1

ฉันมีปัญหานี้เมื่อฉันเปิดโครงการ VS2017 ใน VS2015 สร้างโซลูชันจากนั้นอัปโหลด DLL

การสร้างใหม่ใน VS2017 และการอัปโหลด DLL อีกครั้งช่วยแก้ปัญหาได้


0

ฉันมีคำถามเดียวกัน! ดูเหมือนกับ IIS Express ฉันเปลี่ยน URL ของ IIS Express สำหรับ Project Like:

"http://localhost:3555/"

แล้วปัญหาก็หายไป


0

ปัญหาของฉันคือไซต์ของฉันไม่มีไฟล์ที่จะรวมกลุ่ม อย่างไรก็ตามฉันได้สร้างไซต์ด้วยเทมเพลต MVC ซึ่งรวมถึงสคริปต์ jQuery bundle.config อ้างถึงไฟล์และโฟลเดอร์เหล่านั้น ไม่ต้องการสคริปต์ฉันลบทิ้ง หลังจากแก้ไข bundle.config ทุกอย่างเรียบร้อยดี


0

ทั้งหมดทำงานได้ดีในขณะที่ทำการเปลี่ยนแปลงที่ไม่เกี่ยวข้องและในบิลด์ถัดไปก็เจอปัญหาเดียวกัน ใช้การควบคุมแหล่งที่มาเพื่อเปรียบเทียบกับเวอร์ชันก่อนหน้าและพบว่าโฟลเดอร์ ../Content/Scripts ของฉันถูกล้างอย่างลึกลับ!

กู้คืน ../Content/Scripts/*.* จากการสำรองข้อมูลและทั้งหมดทำงานได้ดี!

ps: การใช้ VS2012, MVC4 เพิ่งอัปเดตแพ็คเกจ NuGet บางส่วนดังนั้นอาจมีส่วนสำคัญในปัญหา แต่ทั้งหมดก็ทำงานได้ดีในระยะหนึ่งหลังจากการอัปเดตดังนั้นจึงไม่แน่ใจ


0

ตรวจสอบไฟล์ BundleConfig.cs ของคุณสำหรับบรรทัดที่เรียกใช้IncludeDirectory ()

เช่น:

  bundles.Add(new Bundle("~/bundle_js_angularGrid").IncludeDirectory(
                       "~/Scripts/Grid", "*.js", true));

ไม่มีไดเร็กทอรี Grid ของฉัน


0

ฉันยังมีข้อผิดพลาดนี้เมื่อรวมกลุ่มที่แยกออกมาทั้งหมดเป็นกลุ่มเดียว

bundles.Add(new ScriptBundle("~/bundles/one").Include(
            "~/Scripts/one.js"));
bundles.Add(new ScriptBundle("~/bundles/two").Include(
            "~/Scripts/two.js"));

เปลี่ยนไปเป็น

bundles.Add(new ScriptBundle("~/bundles/js").Include(
            "~/Scripts/one.js",
            "~/Scripts/two.js"));

ฉันต้องรีเฟรชแอปพลิเคชันพูลบนแผงควบคุมของโฮสติ้งที่ใช้ร่วมกันเพื่อแก้ไขปัญหานี้


0

การลบบรรทัดของโค้ดนี้ออกจากไฟล์คลาส bundleConfig.cs ช่วยแก้ปัญหาของฉัน:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));

0

คำตอบเหล่านี้ไม่มีคำตอบใดช่วยฉันตั้งแต่ฉันสร้างjsxไฟล์ด้วยวิธีแปลก ๆ รหัสของฉันทำงานในโหมด localhost แต่ล้มเหลวในการผลิต

การแก้ไขสำหรับฉันคือเข้าไปในcsprojไฟล์และเปลี่ยนเส้นทางไฟล์จาก<None ...เป็น<Content ...


0

โดยทั่วไปการติดตามสแต็กจะให้สถานที่ที่แน่นอน (ตามที่ไฮไลต์ในภาพหน้าจอ) คุณต้องลบทรัพยากรที่ไม่มีอยู่

ภาพแสดงการติดตามสแต็ก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.