使用 razor 模板化服务实现

本文关键字:服务 实现 razor 使用 | 更新日期: 2023-09-27 18:30:17

我正在考虑开发一种利用ASP的模板服务。NET 的 Razor 用于渲染模板和将渲染模板写入数据库 (ADO.NET)。生成模板的请求可以作为 REST 请求(但也可以是其他请求,通常必须传递大约 10 个参数),并且应用程序必须是自承载的(因此 IIS 上的 WebAPI 不是一个选择 ASP.NET)。此外,它应该在一个月内投入生产。

我已将选择范围缩小到自承载 WCF http 服务和ASP.NET vNext

ASP.NET vNext 当前是否处于我可以将其用于此类任务的状态?我可以直接使用 ADO.NET 还是通过 EF?Tehere有什么好的替代品吗?为什么我倾向于HTTP自托管也是对并发和一次处理大约10个请求的要求。

使用 razor 模板化服务实现

对不起,你的问题和结论对我来说有点不清楚。托管在IIS中的WebAPI和MVC完全能够并发并处理一次处理许多请求。

您选择的数据访问框架(ADO.NET 与实体框架)也与解决方案的 Web 托管部分无关;您可以在任何类型的应用程序中使用任何宿主环境。

所以答案是:如果开发速度是你的主要关注点,请使用你熟悉的框架,因为它会带走学习曲线。

在提出问题时,我们已经决定使用 MVC 5 和 Owin,现在您可以轻松地使用 MVC 6(ASP.NET 5 aka vNext)。

使用 OWIN 托管的控制台应用的代码非常简单,正如您在许多教程中看到的那样:

    private static void Main()
    {
        try
        {
            string baseAddress = ConfigurationManager.AppSettings["ApiBaseAddress"]; 
            Log.Info("Listening on " + baseAddress);
            // Starts OWIN host 
            using (WebApp.Start<Startup>(url: baseAddress))
            {
                Console.ReadLine();
            }
            Log.Info("Host is being closed.");
        }
        catch (Exception exception)
        {
            Log.WriteLine(LogLevel.Fatal, "Error running service: " + exception.ToString());
            throw;
        }
    }

其中Startup是 OWIN 中间件配置的类。此外,通常您会将其托管为 Windows 服务。

我还可以共享一个可用于模板服务的控制器实现。它需要 POST 正文中的 JSON 数据,并在 JSON 对象的根上具有TemplateEncoded属性,其中包含 base64 编码的剃刀临时字符串。然后,从请求 JSON 中提供的其他值呈现此 razor 模板。对于剃须刀模板的呈现,使用剃刀引擎。

    [HttpPost]
    public async Task<IHttpActionResult> Post()
    {
        dynamic model = null;
        string request = string.Empty;
        try
        {
            request = await Request.Content.ReadAsStringAsync();
            model = JsonConvert.DeserializeObject<ExpandoObject>(request);
            model.Template = RequestHelper.FromBase64(model.TemplateEncoded);
            // here you could do some validation, if required.
            var razorResult = Razor.Parse(model.Template, model);
            var result = HttpUtility.HtmlDecode(razorResult);
            return Ok(result);
        }
        catch (Exception ex)
        {
            Log.Error(request, model == null ? "ERROR: template was not converted from base64 encoded string." : model.Template, ex);
            return InternalServerError(ex);
        }
    }