ServiceStack: автономный хост не находит статические файлы

#c# #razor #servicestack #servicestack-bsd

#c# #razor #servicestack #servicestack-bsd

Вопрос:

У меня есть автономный сервис, который находится в следующем URI:

 const string listeningOn = "http://*:80/PassengerTracker/";
  

Примечание: я хочу разместить его по адресу /PassengerTracker . Это лучший способ сделать это?

У меня включены Razor Views, и я указал URL-адрес таким образом для моих статических файлов CSS в моем _Layout.cshtml файле:

 <link href="@Url.Content("~/Content/bootstrap.min.css")" rel="stylesheet" />
  

Однако это возвращает значение 404. Я установил Copy to Ouput Directory значение Copy Always

Редактировать

Если я попытаюсь:

 <link href="@(Request.GetApplicationUrl() 
                 "/Content/bootstrap.min.css")" rel="stylesheet" />
  

Я получаю NotImplementedException ..

Если я изменю listeningOn на http://*:80/ . Я могу использовать @Url.Content нормально.

Редактировать 2

Я попробовал следующее в соответствии с комментарием @Scott ниже:

 <link href="@(AppHost.Config.ServiceStackHandlerFactoryPath 
                        "/Content/bootstrap.min.css")" rel=" stylesheet" />
  

Но он возвращает 404:

 GET http://localhost:8090/passengertracker/PassengerTracker/Content/bootstrap.min.css 
404
  

Я заметил, что он вставляется PassengerTracker дважды?

Комментарии:

1. Какой URL-адрес создается в ссылке при просмотре <link href="@Url.Content("~/Content/bootstrap.min.css")" ... > выходного источника? Вы сообщили ServiceStack, где находится путь к обработчику SetConfig(new EndpointHostConfig { ServiceStackHandlerFactoryPath = "/PassengerTracker" }); ?

2. Да, я установил заводской путь, и URL-адрес: http://localhost/Content/bootstrap.min.css

3. Вместо Request.GetApplicationUrl() того, чтобы вы можете попробовать GetAppHost().Config.ServiceStackHandlerFactoryPath , так оно и есть <link href="@(GetAppHost().Config.ServiceStackHandlerFactoryPath "/Content/bootstrap.min.css")" rel="stylesheet" />

4. Эй, извините, что ехал домой, дайте мне 2 минуты.. Я создам репро и протестирую! 🙂

5. Я отредактировал свой вопрос с обновлением

Ответ №1:

Из обсуждения в чате, похоже, возникла проблема со статическим обработчиком файлов вашего ServiceStack, поэтому вы могли бы создать простую службу, которая, по сути, выполняет ту же задачу и обслуживает файлы из Content каталога.

 [Route("/content/{filePath*}", "GET")] 
public class ContentRequest : IReturnVoid 
{ 
    public string filePath { get; set; } 
} 

public class ContentService : Service 
{ 
    public void Get(ContentRequest request) 
    { 
        var fullPath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "Content", request.filePath); 
        Response.WriteFile(fullPath); 
        Response.End(); 
    } 
}
  

Я надеюсь, это должно сработать для вас 🙂

Комментарии:

1. @BiffBaffBoff Я рад, что это сработало. Да, все еще довольно странно, хотя то, как это сработало для меня.

2. Я обнаружил проблему с этим, он возвращал неправильный тип MIME, который вызывал проблему в IE. Я исправил это, установив ответ. Тип содержимого соответствующим образом зависит от расширения файла