Thư mục không tồn tại. Tên tham số: directoryVirtualPath


115

tôi vừa xuất bản dự án của mình lên máy chủ lưu trữ của tôi trên Arvixe và gặp lỗi này (Hoạt động tốt tại địa phương):

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

Nó có nghĩa là gì ?

Câu trả lời:


229

Tôi gặp vấn đề tương tự và phát hiện ra rằng tôi có một số gói trỏ đến các tệp không thoát bằng cách sử dụng ký tự đại diện {version} và * chẳng hạn như

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

Tôi đã xóa tất cả những thứ đó và lỗi đã biến mất.


2
Không chắc điều này là "đáng kinh ngạc" hoặc khó tìm thấy như thế nào; stacktrace trỏ bạn thẳng đến BundleConfig.RegisterBundlescuộc gọi từ Application_Start+1 của tôi sẽ chuyển đến câu trả lời của @ user2465004.
CrazyPyro

3
Tôi gặp phải lỗi tương tự vì thư mục / scripts / được tham chiếu trong các gói của tôi không tồn tại trên máy chủ của tôi.
user1616625

Tôi đã chuyển đổi một dự án mvc asp.net sang api web và thực sự không sử dụng tệp jquery, css. Rất vui vì tôi đã tìm thấy bài viết của bạn. Đã sửa nó và mọi thứ đều hoạt động tốt.
Sam

3
Ngoài ra, khi xuất bản lên Azure, nó dường như không cho phép bạn xuất bản các thư mục trống. Tôi đã có câu lệnh .IncludeDirectory ("~ / Scripts / Create / Controllers", "* .js") và trong khi thư mục Controllers thực sự tồn tại, nó thực sự không có bất kỳ thứ gì trong đó và điều này gây ra lỗi tương tự. Tôi chỉ cần đặt một tệp văn bản trống trong thư mục, và sau đó nó hoạt động.
RamblerToning

Điều này xảy ra với tôi khi tôi có các thư mục trống được bao gồm trong cấu hình gói của mình, mà tôi dự định thêm tệp vào trong tương lai. Mọi thứ đều ổn tại địa phương vì những thư mục đó tồn tại, nhưng khi tôi đẩy sang Azure, chúng không được tạo,
JMK

16

Tôi đã gặp vấn đề tương tự và nó không phải là vấn đề mã. Tôi đang sử dụng tùy chọn xuất bản (không phải tùy chọn FTP) và Visual Studio không tải lên một số tập lệnh / css của tôi lên máy chủ azure vì chúng không được "đưa vào dự án của tôi". Vì vậy, cục bộ nó hoạt động tốt, vì các tệp ở đó trong ổ cứng của tôi. Điều đã giải quyết vấn đề này trong trường hợp của tôi là "Dự án> Hiển thị tất cả các tệp ..." và nhấp chuột phải vào những tệp không được bao gồm, bao gồm chúng và xuất bản lại


+1 Đây là câu trả lời tốt hơn nhiều so với câu được chấp nhận và có thể nên được hợp nhất vào nó. Vì điều hợp lý đầu tiên cần làm để trả lời "không tìm thấy tệp / thư mục" là kiểm tra xem nó có tồn tại hay không. Nhưng trong tình huống này thì hơi lén lút hơn, vì bạn kiểm tra và nó tồn tại cục bộ chứ không phải trên máy chủ. Đối với một tình huống thậm chí còn kỳ lạ, hãy xem câu trả lời của tôi.
CrazyPyro

Tôi cũng có vấn đề này. Triển khai từ hộp cục bộ của tôi đã hoạt động nhưng từ máy chủ xây dựng thì không. Hóa ra là máy chủ xây dựng không bao gồm các tệp .js được tạo bởi trình biên dịch TypeScript trong gói. Có thể là phiên bản cũ hơn của các công cụ TypeScript trên máy chủ xây dựng. Để khắc phục nhanh chóng, tôi đã đưa các tệp .js vào dự án.
stimms

Đối với tôi, đó là vấn đề với BitTorrent Sync được sử dụng để triển khai tệp. Một số tệp chỉ đơn giản là không được triển khai do một số trục trặc ..
Filip

10

Đây là một lớp học nhanh mà tôi đã viết để làm cho việc này dễ dàng hơn.

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

Để sử dụng nó, chỉ cần thay thế ScriptBundle bằng BundleRelaxed trong mã của bạn, như trong:

        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
Ví dụ tuyệt vời - chỉ có gotcha ở đây là HostingEnvironment.MapPathkhông tính đến các BundleTable.VirtualPathProvidertiện ích mở rộng bạn có thể đang sử dụng ( có thể không mặc định và khôngHostingEnvironment.VirtualPathProvider ). Đối với trường hợp này, bạn sẽ muốn chuyển đổi ví dụ trên để sử dụng BundleTable.VirtualPathProvider.DirectoryExistsBundleTable.VirtualPathProvider.GetDirectory. Tìm kiếm Mẫu tệp trở nên khó khăn hơn một chút, nhưng là nơi tốt để bắt đầu.
SliverNinja - MSFT

Điều này đã khắc phục sự cố cho tôi. Vẫn chưa tìm ra gói vi phạm là ai. Cảm ơn bạn vì mẫu mã mạnh mẽ này, bạn đã cứu tôi khỏi tình trạng trầm trọng thêm vào chiều nay.
Don Rolling

3

Tôi đã gặp phải vấn đề tương tự ngày hôm nay, thực sự là tôi thấy rằng một số tệp trong ~ / Scripts không được xuất bản. Sự cố được giải quyết sau khi tôi xuất bản các tệp bị thiếu


2

Tôi cũng gặp lỗi này do có các thư mục không tồn tại trong tệp Bundles.config của mình. Thay đổi điều này:

<?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>

Về điều này:

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

Giải quyết vấn đề cho tôi.


2

Giống như @JerSchneid, vấn đề của tôi là các thư mục trống, nhưng quá trình triển khai của tôi khác với OP. Tôi đang thực hiện triển khai dựa trên git trên Azure (sử dụng Kudu) và không nhận ra rằng git không bao gồm các thư mục trống trong kho. Xem https://stackoverflow.com/a/115992/1876622

Vì vậy, cấu trúc thư mục cục bộ của tôi là:

[Gốc dự án] / Content / jquery-plugins // có tệp

[Gốc dự án] / Scripts / jquery-plugins // có tệp

[Gốc dự án] / Scripts / misc-plugins // thư mục trống

Trong khi bất kỳ bản sao / kéo nào của kho lưu trữ của tôi trên máy chủ từ xa không nhận được thư mục trống:

[Gốc dự án] / Content / jquery-plugins // có tệp

[Gốc dự án] / Scripts / jquery-plugins // có tệp

Cách tốt nhất để khắc phục điều này là tạo tệp .keep trong thư mục trống. Xem giải pháp SO này: https://stackoverflow.com/a/21422128/1876622


2

Tôi gặp vấn đề tương tự. vấn đề trong trường hợp của tôi là thư mục của tập lệnh với tất cả các tập lệnh bootstrap / jqueries không nằm trong thư mục wwwroot. khi tôi thêm thư mục của tập lệnh vào wwwroot, lỗi đã biến mất.


1

Điều này cũng có thể do tình trạng chạy đua trong khi triển khai:

Nếu bạn sử dụng "Xuất bản" của Visual Studio để triển khai chia sẻ tệp qua mạng và chọn "Xóa tất cả các tệp hiện có trước khi xuất bản." (Đôi khi tôi làm điều này để đảm bảo rằng chúng tôi không vô tình vẫn phụ thuộc vào các tệp đã bị xóa khỏi dự án nhưng vẫn đang treo trên máy chủ.)

Nếu ai đó truy cập trang web trước khi tất cả các tệp JS / CSS bắt buộc được triển khai lại, nó sẽ bắt đầu Application_StartRegisterBundlessẽ không thể tạo đúng các gói và ném ngoại lệ này.

Nhưng vào thời điểm bạn nhận được ngoại lệ này và đi kiểm tra máy chủ, tất cả các tệp cần thiết đã ở đúng vị trí của chúng!

Tuy nhiên, ứng dụng vẫn vui vẻ tiếp tục phục vụ trang web, tạo ra 404 cho bất kỳ yêu cầu gói nào, cùng với các trang chưa được phân loại / không có chức năng là kết quả của việc này và không bao giờ cố gắng xây dựng lại các gói ngay cả sau khi các tệp JS / CSS cần thiết hiện đã có sẵn.

Việc triển khai lại bằng cách sử dụng "Thay thế các tệp phù hợp bằng các bản sao cục bộ" sẽ kích hoạt ứng dụng khởi động lại và đăng ký đúng các gói lần này.


1

Đây có thể là một vấn đề cũ. Tôi gặp lỗi tương tự và trong trường hợp của tôi, đó là thư mục Scripts đang ẩn trong Thư mục Mô hình của tôi. Dấu vết ngăn xếp cho biết rõ ràng Thư mục bị thiếu của nó và theo mặc định, tất cả các Tập lệnh Java phải nằm trong Thư mục Tập lệnh. Điều này có thể không áp dụng cho những người dùng trên.


1

Tôi đã tạo một Angularứng dụng mới và viết

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

nhưng tôi đã tạo không services, vì vậy servicesthư mục không được triển khai khi xuất bản vì nó trống. Thật không may, bạn phải đặt một tệp giả bên trong bất kỳ thư mục trống nào để nó xuất bản

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

Tôi cũng phải đối mặt với cùng một vấn đề. Đã duyệt đến đường dẫn tệp trong Thư mục Tập lệnh. Sao chép tên tệp chính xác và thực hiện thay đổi trong pack.cs:

Mã cũ: //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-*"));

    }
}

Mã mới :

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

Tôi gặp sự cố này khi mở dự án VS2017 trong VS2015, xây dựng giải pháp và sau đó tải lên các tệp DLL.

Việc xây dựng lại nó trong VS2017 và tải lên lại các tệp DLL đã khắc phục sự cố.


0

Tôi có câu hỏi tương tự! Có vẻ như với IIS Express. Tôi thay đổi URL của IIS Express 'cho Project Like:

"http://localhost:3555/"

sau đó vấn đề biến mất.


0

Vấn đề của tôi là trang web của tôi không có tệp nào để nhóm. Tuy nhiên, tôi đã tạo trang web bằng mẫu MVC, bao gồm các tập lệnh jQuery. Gói.config tham chiếu đến các tệp đó và các thư mục của chúng. Không cần các tập lệnh, tôi đã xóa chúng. Sau khi chỉnh sửa bó.config, tất cả đều tốt.


0

Tất cả đều hoạt động tốt, sau đó trong khi thực hiện các thay đổi không liên quan và trong lần xây dựng tiếp theo đã gặp phải vấn đề tương tự. Đã sử dụng kiểm soát nguồn để so sánh với các phiên bản trước và phát hiện ra rằng thư mục ../Content/Scripts của tôi đã bị trống một cách bí ẩn!

Đã khôi phục ../Content/Scripts/*.* từ bản sao lưu và tất cả đều hoạt động tốt!

ps: Sử dụng VS2012, MVC4, gần đây đã cập nhật một số gói NuGet, vì vậy điều đó có thể đã đóng một phần nào đó trong vấn đề, nhưng tất cả đều chạy tốt trong một thời gian sau khi cập nhật, vì vậy không chắc chắn.


0

xem xét tệp BundleConfig.cs của bạn để tìm các dòng gọi bao gồm Bao gồm ()

I E:

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

thư mục Grid của tôi không tồn tại.


0

Tôi cũng gặp lỗi này khi kết hợp tất cả các gói đã tách của mình thành một gói.

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

Thay đổi để

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

Tôi đã phải làm mới nhóm ứng dụng trên bảng điều khiển của máy chủ lưu trữ được chia sẻ của mình để khắc phục sự cố này.


0

Xóa các dòng mã này khỏi tệp lớp packConfig.cs đã giải quyết được thách thức của tôi:

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

0

Không có câu trả lời nào trong số những câu trả lời này giúp ích cho tôi vì tôi đã tạo jsxcác tệp của mình theo cách kỳ lạ. Mã của tôi đang hoạt động ở chế độ localhost nhưng không thành công trong quá trình sản xuất.

Cách khắc phục đối với tôi là vào csprojtệp và thay đổi đường dẫn tệp từ <None ...thành<Content ...


0

Về cơ bản, dấu vết ngăn xếp cung cấp cho bạn vị trí chính xác (như được đánh dấu trong ảnh chụp màn hình) mà bạn cần xóa tài nguyên không tồn tại.

hình ảnh hiển thị dấu vết ngăn xếp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.