Вложенный проект 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.