Dizin mevcut değil. Parametre adı: directoryVirtualPath


115

Projemi Arvixe'deki ana bilgisayarımda yayınladım ve şu hatayı alıyorum (Yerelde iyi çalışıyor):

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

Bu ne demek ?

Yanıtlar:


229

Aynı sorunu yaşadım ve {version} ve * joker karakterleri gibi mevcut olmayan dosyalara işaret eden bazı paketlerim olduğunu öğrendim.

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

Bunların hepsini kaldırdım ve hata ortadan kalktı.


2
Bunun nasıl "şaşırtıcı derecede belirsiz" veya bulunması zor olduğundan emin değilim; Stacktrace sizi doğrudan + 1'imden BundleConfig.RegisterBundlesgelen aramaya yönlendiriyor ve Application_Startbunun yerine @ user2465004'ün cevabına gidiyor.
CrazyPyro

3
Paketlerimde atıfta bulunulan / scripts / klasörü sunucumda olmadığı için aynı hatayı aldım.
user1616625

Bir asp.net mvc projesini web api'ye dönüştürdüm ve jquery, css dosyalarını gerçekten kullanmadım. Gönderinizi bulduğuma sevindim. Düzeltildi ve her şey yolunda gidiyor.
Sam

3
Buna ek olarak, Azure'da yayımlarken boş klasörler yayınlamanıza izin vermiyor gibi görünüyor. Bir .IncludeDirectory ("~ / Scripts / Create / Controllers", "* .js") ifadesine sahiptim ve Controllers klasörü gerçekten mevcutken, aslında henüz içinde hiçbir şey içermiyordu ve bu aynı hataya neden oldu. Klasöre boş bir metin dosyası koydum ve sonra çalıştı.
RamblerToning

Bu, gelecekte dosya eklemeyi planladığım paket yapılandırmamda boş dizinlerim olduğunda başıma geldi. Yerel olarak her şey yolundaydı çünkü bu dizinler vardı, ancak
JMK

16

Aynı sorunu yaşadım ve bu bir kod sorunu değildi. Yayınlama seçeneğini (FTP olanı değil) kullanıyordum ve Visual Studio, "projeme dahil edilmedikleri" için betiklerimden / css'lerden bazılarını Azure sunucusuna yüklemiyordu. Yani, yerel olarak gayet iyi çalıştı, çünkü dosyalar sabit sürücümde vardı. Benim durumumda bu sorunu çözen şey "Proje> Tüm dosyaları göster ..." idi ve dahil edilmeyenlere sağ tıklayın, ekleyin ve tekrar yayınlayın


+1 Bu, kabul edilen yanıttan çok daha iyi bir cevaptır ve belki de onunla birleştirilmelidir. Bir "dosya / dizin bulunamadı" durumuna yanıt olarak yapılacak ilk mantıksal şey zaten var olup olmadığını kontrol etmektir. Ancak bu durumda biraz daha sinsi, çünkü kontrol ediyorsunuz ve yerel olarak var, sadece sunucuda değil. Daha da garip bir durum için cevabıma bakın.
CrazyPyro

Ben de bu sorunu yaşadım. Yerel kutumdan dağıtım işe yaradı, ancak yapı sunucusundan yapmadı. Yapı sunucusunun, TypeScript derleyicisi tarafından oluşturulan .js dosyalarını pakette içermediği ortaya çıktı. Yapı sunucusundaki TypeScript araçlarının muhtemelen daha eski bir sürümü. Hızlı bir düzeltme olarak .js dosyalarını projeye dahil ettim.
2014

Benim için bu, dosyaları dağıtmak için kullanılan BitTorrent Sync ile ilgili bir sorundu. Bazı dosyalar, bazı aksaklıklar nedeniyle dağıtılamadı ..
Filip

10

İşte bunu kolaylaştırmak için yazdığım hızlı bir ders.

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

Kullanmak için, ScriptBundle'ı kodunuzda aşağıdaki gibi BundleRelaxed ile değiştirmeniz yeterlidir:

        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
Harika bir örnek - burada sadece aldığınız HostingEnvironment.MapPathşey BundleTable.VirtualPathProvider, kullanıyor olabileceğiniz uzantıları dikkate almayan olmasıdır ( varsayılan olmayabilir ve olmayabilirHostingEnvironment.VirtualPathProvider ). Bu durum için, kullanım yukarıdaki örneği dönüştürmek isterim BundleTable.VirtualPathProvider.DirectoryExistsve BundleTable.VirtualPathProvider.GetDirectory. Dosya Modeli aramaları biraz daha sorunlu hale gelir, ancak başlamak için iyi bir yer.
SliverNinja - MSFT

Bu benim için sorunu çözdü. Hâlâ rahatsız edici paketin kim olduğunu bulamadım. Bu güçlü kod örneği için teşekkür ederim, beni bu öğleden sonra daha da kötüleşmekten kurtardın.
Don Rolling

3

Bugün aynı sorunla karşılaştım, aslında ~ / Scripts altındaki bazı dosyaların yayınlanmadığını buldum. Eksik dosyaları yayınladıktan sonra sorun çözüldü


2

Bu hatayı, bundles.config dosyamda var olmayan dizinler bulunduğundan da aldım. Bunu değiştirmek:

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

Buna:

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

Sorunu benim için çöz.


2

@JerSchneid gibi, benim sorunum boş dizinlerdi, ancak dağıtım sürecim OP'den farklıydı. Azure'da (Kudu kullanan) git tabanlı bir dağıtım yapıyordum ve git'in depoda boş dizinler içermediğini fark etmemiştim. Bkz. Https://stackoverflow.com/a/115992/1876622

Yani yerel klasör yapım şuydu:

[Proje Kökü] / İçerik / jquery-eklentileri // dosyalar içeriyordu

[Proje Kökü] / Scripts / jquery-plugins // dosyalar içeriyordu

[Proje Kökü] / Scripts / misc-plugins // boş klasör

Uzak sunucudaki depomun herhangi bir klonu / çekilmesi söz konusu boş dizini almıyordu:

[Proje Kökü] / İçerik / jquery-eklentileri // dosyalar içeriyordu

[Proje Kökü] / Scripts / jquery-plugins // dosyalar içeriyordu

Bunu düzeltmek için en iyi yaklaşım boş dizinde bir .keep dosyası oluşturmaktır. Bu SO çözümüne bakın: https://stackoverflow.com/a/21422128/1876622


2

Ben de aynı sorunu yaşadım. benim durumumdaki sorun, komut dosyasının tüm bootstrap / jqueries komut dosyalarını içeren klasörünün wwwroot klasöründe olmamasıydı. betiğin klasörünü wwwroot'a ekledikten sonra hata gitti.


1

Bu, konuşlandırma sırasındaki bir yarış durumundan da kaynaklanabilir:

Bir ağ dosya paylaşımı üzerinden dağıtmak için Visual Studio'nun "Yayınla" yı kullanıyorsanız ve "Yayınlamadan önce mevcut tüm dosyaları sil" seçeneğini işaretleyin. (Bunu bazen farkında olmadan hala projeden kaldırılan dosyalara bağlı olmadığımızdan emin olmak için yapıyorum, ancak yine de sunucuda takılıyoruz.)

Birisi, gerekli tüm JS / CSS dosyaları yeniden dağıtılmadan önce siteye ulaşırsa, site başlayacak Application_Startve RegisterBundlesbu da paketleri düzgün bir şekilde oluşturup bu istisnayı atamayacaktır.

Ancak bu istisnayı aldığınızda ve sunucuyu kontrol ettiğinizde, gerekli tüm dosyalar tam olması gerektiği yerde olur!

Bununla birlikte, uygulama mutlu bir şekilde siteye hizmet vermeye devam eder, bundan kaynaklanan şekillendirilmemiş / işlevsiz sayfaların yanı sıra herhangi bir paket isteği için 404'ler oluşturur ve gerekli JS / CSS dosyaları artık mevcut olduktan sonra bile paketleri yeniden oluşturmaya asla çalışmaz.

"Eşleşen dosyaları yerel kopyalarla değiştir" kullanılarak yapılan yeniden dağıtım, uygulamanın bu kez paketleri yeniden başlatmasını ve doğru şekilde kaydetmesini tetikler.


1

Bu eski bir sorun olabilir Benzer bir hatam var ve benim durumumda Model Klasörümde Scripts klasörünün saklanmasıydı. Yığın izleme, eksik Dizini ve varsayılan olarak tüm Java Komut Dosyalarının Komut Dosyaları Klasöründe olması gerektiğini açıkça belirtir. Bu, yukarıdaki kullanıcılar için geçerli olmayabilir.


1

Yeni bir Angularuygulama oluşturdum ve yazdım

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

ancak hayır oluşturmuştum services, bu yüzden servicesklasör boş olduğu için yayınlama sırasında konuşlandırılmadı. Ne yazık ki, yayınlayabilmek için boş bir klasörün içine sahte bir dosya koymanız gerekiyor

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

Ben de aynı sorunla karşılaştım. Komut Dosyası Klasörü altındaki dosya yoluna göz atıldı. Tam dosya adı kopyalandı ve bundle.cs dosyasında değişiklik yapıldı:

Eski Kod: //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-*"));

    }
}

Yeni kod :

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

VS2015'te bir VS2017 projesi açtığımda, çözümü oluşturduğumda ve ardından DLL'leri yüklediğimde bu sorunu yaşadım.

VS2017'de yeniden oluşturmak ve DLL'leri yeniden yüklemek sorunu çözdü.


0

Ben de aynı soruyu aldım! IIS Express ile öyle görünüyor. IIS Express'in URL'sini Project Like için değiştiriyorum:

"http://localhost:3555/"

sonra sorun gitti.


0

Benim sorunum, sitemde paketlenecek dosya olmamasıydı. Ancak siteyi jQuery betiklerini içeren bir MVC şablonuyla oluşturmuştum. Bundle.config dosyası bu dosyalara ve klasörlerine başvurdu. Komut dosyalarına ihtiyacım yok, onları sildim. Bundle.config dosyasını düzenledikten sonra her şey yolundaydı.


0

Her şey yolunda gidiyordu, sonra ilgisiz değişiklikler yaparken ve bir sonraki yapıda aynı sorunla karşılaştı. Önceki sürümlerle karşılaştırmak için kaynak kontrolü kullandım ve ../Content/Scripts klasörümün gizemli bir şekilde boşaltıldığını keşfetti!

Bir yedekten ../Content/Scripts/*.* geri yüklendi ve hepsi iyi çalıştı!

ps: VS2012'yi kullanarak, MVC4, yakın zamanda bazı NuGet paketlerini güncellemişti, bu nedenle bu, sorunda bir rol oynamış olabilir, ancak güncellemeden sonra bir süre iyi çalıştı, bu yüzden emin değilim.


0

Çağıran satırlar için BundleConfig.cs dosyanıza bakın IncludeDirectory () 'yi

yani:

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

Izgara dizinim yoktu.


0

Ayrılmış tüm paketlerimi tek bir paket halinde birleştirdiğimde de bu hatayı aldım.

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

Olarak değiştirildi

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

Bu sorunu gidermek için paylaşılan barındırma denetim masamdaki uygulama havuzunu yenilemem gerekiyordu .


0

Bu kod satırlarını bundleConfig.cs sınıf dosyasından kaldırmak sorunumu çözdü:

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

0

jsxDosyalarımı tuhaf bir şekilde oluşturduğumdan beri bu yanıtların hiçbiri bana yardımcı olmadı. Kodum localhost modunda çalışıyordu ancak üretimde başarısız oldu.

Benim için düzeltme csprojdosyaya girip dosya yollarını olarak <None ...değiştirmekti.<Content ...


0

Temel olarak yığın izleme, mevcut olmayan kaynakları kaldırmak için ihtiyacınız olan yeri (ekran görüntüsünde vurgulandığı gibi) verir.

yığın izini gösteren resim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.