2015-05-28 2 views
2

У меня есть самообслуживающее приложение, использующее OWIN для предоставления базового веб-сервера. Ключевой частью конфигурации является следующая строка:Изменить страницу OWIN/Katana PhysicalFileSystem по запросу

appBuilder.UseFileServer(new FileServerOptions { 
    FileSystem = new PhysicalFileSystem(filePath) 
}); 

Это обеспечивает статические файлы, перечисленные в filePath для просмотра, и это много работает, как ожидалось.

Однако я столкнулся с ситуацией, когда хочу немного изменить один из файлов на основе запроса по запросу. В частности, я хочу загрузить «нормальную» версию файла из файловой системы, немного изменить ее на основе заголовков входящего веб-запроса, а затем вернуть измененную версию клиенту вместо оригинала. Все остальные файлы должны оставаться неизмененными.

Как мне это сделать?

ответ

1

Ну, я не знаю, если это хороший способ сделать это, но это, кажется, работает:

internal class FileReplacementMiddleware : OwinMiddleware 
{ 
    public FileReplacementMiddleware(OwinMiddleware next) : base(next) {} 

    public override async Task Invoke(IOwinContext context) 
    { 
     MemoryStream memStream = null; 
     Stream httpStream = null; 
     if (ShouldAmendResponse(context)) 
     { 
      memStream = new MemoryStream(); 
      httpStream = context.Response.Body; 
      context.Response.Body = memStream; 
     } 

     await Next.Invoke(context); 

     if (memStream != null) 
     { 
      var content = await ReadStreamAsync(memStream); 
      if (context.Response.StatusCode == 200) 
      { 
       content = AmendContent(context, content); 
      } 
      var contentBytes = Encoding.UTF8.GetBytes(content); 
      context.Response.Body = httpStream; 
      context.Response.ETag = null; 
      context.Response.ContentLength = contentBytes.Length; 
      await context.Response.WriteAsync(contentBytes, context.Request.CallCancelled); 
     } 
    } 

    private static async Task<string> ReadStreamAsync(MemoryStream stream) 
    { 
     stream.Seek(0, SeekOrigin.Begin); 
     using (var reader = new StreamReader(stream, Encoding.UTF8)) 
     { 
      return await reader.ReadToEndAsync(); 
     } 
    } 

    private bool ShouldAmendResponse(IOwinContext context) 
    { 
     // logic 
    } 

    private string AmendContent(IOwinContext context, string content) 
    { 
     // logic 
    } 
} 

Добавьте к этому трубопроводу где-то до статических файлов ППО.

Смежные вопросы