You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/WebSemanticService/semantic/Semantic.API/WebAPI/BaseHtmlController.cs

208 lines
9.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Web.Http;
using ZeroLevel.Services.Web;
namespace ZeroLevel.WebAPI
{
public abstract class BaseHtmlController : BaseController
{
protected readonly string _baseResourcesFolder;
public BaseHtmlController(string baseResourcesFolder)
{
_baseResourcesFolder = baseResourcesFolder;
}
#region Resource responce
/// <summary>
/// Создает ответ с JS в качетве содержимого
/// </summary>
/// <param name="filename">Имя js файла</param>
/// <returns>Готовый ответ</returns>
private HttpResponseMessage CreateJSResponse(HttpRequestMessage request, string filename)
{
var absolutePath = Path.Combine(_baseResourcesFolder, "JS", filename);
return CreateFromFileResponse(request, absolutePath, "application/javascript");
}
/// <summary>
/// Создает ответ с CSS в качетве содержимого
/// </summary>
/// <param name="filename">Имя css файла</param>
/// <returns>Готовый ответ</returns>
private HttpResponseMessage CreateCSSResponse(HttpRequestMessage request, string filename)
{
var absolutePath = Path.Combine(_baseResourcesFolder, "CSS", filename);
return CreateFromFileResponse(request, absolutePath, "text/css");
}
/// <summary>
/// Создает ответ с фрагментом HTML в качетве содержимого
/// </summary>
/// <param name="filename">Имя файла с HTML фрагментом</param>
/// <returns>Готовый ответ</returns>
protected HttpResponseMessage CreateHTMLResponse(HttpRequestMessage request, string filename)
{
var absolutePath = Path.Combine(_baseResourcesFolder, filename);
if (false == File.Exists(absolutePath))
{
absolutePath = Path.Combine(_baseResourcesFolder, "HTML", filename);
}
return CreateFromFileResponse(request, absolutePath, "text/html");
}
/// <summary>
/// Создает ответ с изображением в качестве содержимого
/// </summary>
/// <param name="filename">Имя файла с изображением</param>
/// <returns>Готовый ответ</returns>
public HttpResponseMessage CreateImageResponse(HttpRequestMessage request, string filename)
{
var absolutePath = Path.Combine(_baseResourcesFolder, "images", filename);
switch (Path.GetExtension(filename).ToLower())
{
case ".ico":
return CreateFromFileBinaryResponse(request, absolutePath, "image/x-icon");
case ".png":
return CreateFromFileBinaryResponse(request, absolutePath, "image/png");
case ".jpeg":
case ".jpg":
return CreateFromFileBinaryResponse(request, absolutePath, "image/jpeg");
case ".gif":
return CreateFromFileBinaryResponse(request, absolutePath, "image/gif");
}
return request.CreateSelfDestroyingResponse(HttpStatusCode.NotFound);
}
#endregion
#region File system
/// <summary>
/// Создает ответ в текстовом представлении, из указанного файла
/// </summary>
/// <param name="filename">Путь к файлу</param>
/// <param name="mediaType">Mime-тип содержимого файла</param>
/// <returns>Результат</returns>
private static HttpResponseMessage CreateFromFileResponse(HttpRequestMessage request, string filename, string mediaType)
{
try
{
var content = File.ReadAllText(
Path.Combine(ZeroLevel.Configuration.BaseDirectory, filename), Encoding.UTF8);
var response = request.CreateSelfDestroyingResponse(HttpStatusCode.OK);
response.Content = new StringContent(content);
response.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
return response;
}
catch (Exception ex)
{
Log.Warning(string.Format("Не удалось загрузить файл {0} в качестве ответа типа {1}", filename, mediaType), ex.ToString());
return request.CreateSelfDestroyingResponse(HttpStatusCode.NotFound);
}
}
/// <summary>
/// Создает ответ в виде байт-массива из указанного файла
/// </summary>
/// <param name="filename">Путь к файлу</param>
/// <param name="mediaType">Mime-тип содержимого файла</param>
/// <returns>Результат</returns>
private static HttpResponseMessage CreateFromFileBinaryResponse(HttpRequestMessage request, string filename, string mediaType)
{
try
{
var response = request.CreateSelfDestroyingResponse();
response.Content = new ByteArrayContent(File.ReadAllBytes(
Path.Combine(ZeroLevel.Configuration.BaseDirectory, filename)));
response.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
return response;
}
catch (Exception ex)
{
Log.Warning(string.Format("Не удалось загрузить файл {0} в качестве ответа типа {1}", filename, mediaType), ex.ToString());
return request.CreateSelfDestroyingResponse(HttpStatusCode.NotFound);
}
}
#endregion
/// <summary>
/// Выполняет поиск и возврат в качестве ответа ресурса сайта,
/// javascript, css файла или файла с изображением
/// </summary>
/// <param name="request">Запрос</param>
/// <returns>Ответ</returns>
protected HttpResponseMessage _GetResource(HttpRequestMessage request)
{
var keys = UrlUtility.ParseQueryString(request.RequestUri.Query);
if (keys.ContainsKey("js"))
{
var filename = WepApiResourceRouter.GetJsFile(keys["js"]);
return CreateJSResponse(request, filename);
}
else if (keys.ContainsKey("css"))
{
var filename = WepApiResourceRouter.GetCssFile(keys["css"]);
return CreateCSSResponse(request, filename);
}
else if (keys.ContainsKey("html"))
{
var filename = WepApiResourceRouter.GetHtmlFile(keys["html"]);
return CreateHTMLResponse(request, filename);
}
else if (keys.ContainsKey("img"))
{
return CreateImageResponse(request, keys["img"]);
}
else
{
var key = request.RequestUri.LocalPath.Trim('/');
if (string.IsNullOrWhiteSpace(key)) key = "index";
var filename = WepApiResourceRouter.GetHtmlFile(key);
if (false == string.IsNullOrWhiteSpace(filename))
{
return CreateHTMLResponse(request, filename);
}
}
return request.CreateSelfDestroyingResponse(HttpStatusCode.NotFound);
}
/// <summary>
/// Создает ответ в виде фрагмента HTML
/// </summary>
/// <param name="text">HTML текст</param>
/// <returns></returns>
protected static HttpResponseMessage CreateHTMLFragmentResponse(HttpRequestMessage request, string text)
{
var response = request.CreateSelfDestroyingResponse();
response.Content = new StringContent(text);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
return response;
}
#region Helpers
/// <summary>
/// Хак для JQuery UI
/// </summary>
[HttpGet]
[Route("images/{id}")]
[Route("api/web/images/{id}")]
public HttpResponseMessage Images(HttpRequestMessage request, [FromUri]string id)
{
return CreateImageResponse(request, id);
}
/// <summary>
/// Выполняет поиск и возврат в качестве ответа ресурса сайта,
/// javascript, css файла или файла с изображением
/// </summary>
/// <param name="request">Запрос</param>
/// <returns>Ответ</returns>
[HttpGet]
[Route("api/web/resources")]
public HttpResponseMessage GetResource(HttpRequestMessage request)
{
return _GetResource(request);
}
#endregion
}
}

Powered by TurnKey Linux.