3

Мое приложение работает в Azure Service Fabric. В моем приложении я использую asp.net web api с angularJS как интерфейс. Мой веб-api - это собственный хост с OWIN/Katana, и это отлично работает.Статический файловый сервер с OWIN -> файлы не найдена ошибка

Чтобы обслуживать статические файлы для клиента, я использую статический файловый сервер OWIN. Чтобы использовать файловый сервер, я принял конфигурацию из примеров Service Fabric.

public void Configuration(IAppBuilder appBuilder) 
     { 
      HttpConfiguration httpConfig = this.ConfigureWebApi(); 
      FileServerOptions fileServerOptions = this.ConfigureFileSystem(appBuilder); 

      appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
      appBuilder.UseWebApi(this.ConfigureWebApi()); 
      appBuilder.UseFileServer(fileServerOptions); 
     } 

private FileServerOptions ConfigureFileSystem(IAppBuilder appBuilder) 
     { 
      PhysicalFileSystem physicalFileSystem = new PhysicalFileSystem(@".\wwwroot"); 
      FileServerOptions fileOptions = new FileServerOptions(); 

      fileOptions.EnableDefaultFiles = true; 
      fileOptions.RequestPath = PathString.Empty; 
      fileOptions.FileSystem = physicalFileSystem; 
      fileOptions.DefaultFilesOptions.DefaultFileNames = new[] { "index.html" }; 
      fileOptions.StaticFileOptions.FileSystem = fileOptions.FileSystem = physicalFileSystem; 
      fileOptions.StaticFileOptions.ServeUnknownFileTypes = true; 

      return fileOptions; 
     } 

Каталог файлов выглядит следующим образом:

wwwroot 

--+ app 

----+ content 

------+ css 

-------- site.css 

----+ bower_components 

------+ angular 

-------- angular.min.js 

----- app.js 

--- index.html 

Все эти файлы также в Bin/Debug/папки после сборки. Когда я открываю адрес http://localhost:80/ в браузере, я получаю файл index.html. Но все остальные файлы, кроме http://localhost:80/app/app.js, не найдены.

Ссылки в index.html выглядеть следующим образом:

<link href="app/content/css/site.css" rel="stylesheet" /> 
<script src="app/bower_components/angular/angular.min.js"></script> 
<script src="app/app.js"></script> 

Я пробовал много других конфигураций, но это не сработало. Что-то не так, чего я не вижу?

ответ

1

Я нашел проблему. Чтобы скопировать все файлы из папки wwwroot в папку Debug/bin/, я использую эту команду в Visual Studio: XCOPY "$(SolutionDir)WebAppApi.Service\wwwroot" "$(TargetDir)wwwroot" /s /i /y. Я думал, что это то же самое, что я установил бы «Copy to Output Directory» -property для «Копировать, если новый» или «Копировать всегда». Команда XCOPY копирует все файлы в папку отладки. Но в Azure Service Fabric есть также «основная» папка отладки для всех включенных сервисов (\[application name]\pkg\Debug\[service project name]Pkg\Code\wwwroot). И в этой папке нет папки wwwroot, потому что у всех файлов есть «Не копировать» как «Копировать в каталог вывода», кроме index.html и app.js.

0

Я боролся в течение нескольких часов с той же проблемой. За исключением того, что мне нужно было скопировать сгенерированные файлы из сборки webpack. Поэтому я добавил следующий фрагмент файла sfproj.

<PropertyGroup> 
    <FrontendApplication>FrontendAppName</FrontendApplication> 
</PropertyGroup> 
<ItemGroup> 
    <ClientSourceFiles Include="$(SolutionDir)$(FrontendApplication)\app\build\**\*.*" />  
</ItemGroup> 
<Target Name="CopyAppToPackage" AfterTargets="CollectServiceCodeFiles"> 
<Copy SourceFiles="@(ClientSourceFiles)" DestinationFolder="$(SolutionDir)$(ProjectName)\pkg\$(ConfigurationName)\$(FrontendApplication)Pkg\Code\wwwroot\%(RecursiveDir)" /> 
</Target> 

app\build является выходным каталогом WebPack и wwwroot является каталогом, используемым PhysicalFileSystem.

Это решает проблему, заключающуюся в том, что одна из задач в целевой структуре сборки сервиса очищает каталог пакета.