Вложенный проект dart предотвращает рендеринг представлений ServiceStack.Razor

Ситуация

Я разрабатываю чистое приложение ServiceStack/Razor (без MVC4 или Web API) с использованием лицензионного ServiceStack 4.0.12. У меня есть представление (cshtml), которое ссылается на файл Javascript, который передается из проекта дартс (с помощью AngularDart).

Для удобства я вкладываю папку проекта dart в проект ServiceStack, но не включаю ее в Visual Studio. Затем я работаю над проектом дартс, используя Dart Editor отдельно.

Общая структура проекта выглядит примерно так:

MyApp.csproj
Global.asax.cs
\Controllers           <- contains the IService formatted by 'Views\index.cshtml'.
\Dart                  <- not included in Visual Studio project.
     \packages
     \build
           \myapp.dart.js
     \lib
     \web
         \myapp.dart
\Views                 
      \index.cshtml    <- references 'myapp.dart.js'

Я установил простой, работающий ServiceStack/Razor "Hello World" в Local IIS, затем переключился на Dart Editor, чтобы настроить мой проект dart.

Эта проблема

Представьте, что мое разочарование вернулось через несколько минут, и я обнаружил, что мой прекрасный "Hello World" был заменен "Snapshot of Index". Не прикасаясь ни к одной строке кода, конфигурации или повторной компиляции.

Когда я переключился на IIS Express, приложение ServiceStack/Razor снова заработало бы нормально. Тот же код, без изменений в конфигурации или повторной компиляции.

Потеряв прическу в течение нескольких часов, выполнив различные настройки конфигурации и поиграв с песочницей безрезультатно, я случайно переместил папку "Dart" из папки проекта VS, изменил Web.config и обновил приложение - и приложение заработало снова!

Конечно же, когда я поместил папку "Dart" обратно в папку проекта, изменил Web.config и обновил - приложение снова вернулось к снимку.

Вопрос

Конечно, мой вопрос: может ли кто-нибудь сказать мне, почему при вложении папки проекта Dart в папку проекта ServiceStack ServiceStack.Razor прекращает рендеринг представлений?

Изменить: Больше информации

Папка Dart содержит следующие типы файлов:

  • pubspec.yaml
  • pubspec.lock
  • *.js
  • *.dart
  • *.json
  • ярлык для папки "packages" из папки "web" (DartEditor создает это)

Изменить: Больше информации от совета Mythz

? Отлаживать =requestinfo 
выдал следующие StartUpErrors:

"StartUpErrors": [
        {
            "ErrorCode": "UnauthorizedAccessException",
            "Message": "Access to the path 'D:\\Semi Da Vinci\\git\\BEAU\\BEAU.Beaufort.git\\Source\\BEAU.Beaufort.Website\\Dart\\packages\\analyzer' is denied.",
            "StackTrace": "[Object: 12/03/2014 4:44:51 PM]:\n[REQUEST: ]\nSystem.UnauthorizedAccessException: Access to the path 'D:\\Semi Da Vinci\\git\\BEAU\\BEAU.Beaufort.git\\Source\\BEAU.Beaufort.Website\\Dart\\packages\\analyzer' is denied.\r\n   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n   at System.IO.FileSystemEnumerableIterator`1.CommonInit()\r\n   at System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)\r\n   at System.IO.DirectoryInfo.InternalGetFiles(String searchPattern, SearchOption searchOption)\r\n   at ServiceStack.VirtualPath.FileSystemVirtualDirectory.GetMatchingFilesInDir(String globPattern)\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()\r\n   at System.Linq.Enumerable.<DistinctIterator>d__81`1.MoveNext()\r\n   at ServiceStack.Formats.MarkdownFormat.<FindMarkdownPages>d__7.MoveNext()\r\n   at ServiceStack.Formats.MarkdownFormat.RegisterMarkdownPages(String dirPath)\r\n   at ServiceStack.Formats.MarkdownFormat.Register(IAppHost appHost)\r\n   at ServiceStack.ServiceStackHost.LoadPlugin(IPlugin[] plugins)",
            "Errors": []
        },
        {
            "ErrorCode": "UnauthorizedAccessException",
            "Message": "Access to the path 'D:\\Semi Da Vinci\\git\\BEAU\\BEAU.Beaufort.git\\Source\\BEAU.Beaufort.Website\\Dart\\packages\\analyzer' is denied.",
            "StackTrace": "[Object: 12/03/2014 4:44:51 PM]:\n[REQUEST: ]\nSystem.UnauthorizedAccessException: Access to the path 'D:\\Semi Da Vinci\\git\\BEAU\\BEAU.Beaufort.git\\Source\\BEAU.Beaufort.Website\\Dart\\packages\\analyzer' is denied.\r\n   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n   at System.IO.FileSystemEnumerableIterator`1.CommonInit()\r\n   at System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)\r\n   at System.IO.DirectoryInfo.InternalGetFiles(String searchPattern, SearchOption searchOption)\r\n   at ServiceStack.VirtualPath.FileSystemVirtualDirectory.GetMatchingFilesInDir(String globPattern)\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()\r\n   at System.Linq.Enumerable.<DistinctIterator>d__81`1.MoveNext()\r\n   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()\r\n   at ServiceStack.EnumerableExtensions.Each[T](IEnumerable`1 values, Action`1 action)\r\n   at ServiceStack.Razor.Managers.RazorViewManager.Init()\r\n   at ServiceStack.Razor.RazorFormat.Init()\r\n   at ServiceStack.Razor.RazorFormat.Register(IAppHost appHost)",
            "Errors": []
        },
        {
            "ErrorCode": "UnauthorizedAccessException",
            "Message": "Access to the path 'D:\\Semi Da Vinci\\git\\BEAU\\BEAU.Beaufort.git\\Source\\BEAU.Beaufort.Website\\Dart\\packages\\analyzer' is denied.",
            "StackTrace": "[Object: 12/03/2014 4:44:51 PM]:\n[REQUEST: ]\nSystem.UnauthorizedAccessException: Access to the path 'D:\\Semi Da Vinci\\git\\BEAU\\BEAU.Beaufort.git\\Source\\BEAU.Beaufort.Website\\Dart\\packages\\analyzer' is denied.\r\n   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n   at System.IO.FileSystemEnumerableIterator`1.CommonInit()\r\n   at System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)\r\n   at System.IO.DirectoryInfo.InternalGetFiles(String searchPattern, SearchOption searchOption)\r\n   at ServiceStack.VirtualPath.FileSystemVirtualDirectory.GetMatchingFilesInDir(String globPattern)\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at ServiceStack.VirtualPath.AbstractVirtualDirectoryBase.<GetAllMatchingFiles>d__0.MoveNext()\r\n   at System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()\r\n   at System.Linq.Enumerable.<DistinctIterator>d__81`1.MoveNext()\r\n   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()\r\n   at ServiceStack.EnumerableExtensions.Each[T](IEnumerable`1 values, Action`1 action)\r\n   at ServiceStack.Razor.Managers.RazorViewManager.Init()\r\n   at ServiceStack.Razor.RazorFormat.Init()\r\n   at ServiceStack.Razor.RazorFormat.Register(IAppHost appHost)\r\n   at ServiceStack.ServiceStackHost.LoadPlugin(IPlugin[] plugins)",
            "Errors": []
        }
    ],

При ближайшем рассмотрении все папки, расположенные в каталоге /packages, являются символическими ссылками на оригинальные библиотеки в системном кэше (дополнительная информация здесь: https://www.dartlang.org/tools/pub/faq.html).

Похоже, ServiceStack срабатывает по этим символическим ссылкам.

1 ответ

Решение

Возникла проблема с невозможностью сканировать символические ссылки в Windows с помощью API-интерфейса File IO.NET, которые теперь вместо этого регистрируются как предупреждения в этом коммите. Это исправление доступно в MyGet сейчас или в следующей версии 4.0.0 + на NuGet.

Другие вопросы по тегам