【问题标题】:Templating service implementation with razor使用 razor 实现模板服务
【发布时间】:2015-01-10 12:02:12
【问题描述】:

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

我已将选择范围缩小到自托管 WCF http 服务ASP.NET vNext

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

【问题讨论】:

标签: c# wcf razor client-server asp.net-core


【解决方案1】:

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

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

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

【讨论】:

  • 也许问题有点意义,我会努力改进的。但是我仍然有这个问题要解决并且没有 IIS。只是我想弄清楚使用 vNext 是否值得考虑,是否可以直接使用 ADO.NET。应该不是问题。
  • 不使用 IIS 是您的选择或要求吗?这对我来说还不清楚。 ADO.NET 不是 HTTP 库,所以不,您不能直接使用它。你的意思是WCF Data Services,以前的 ADO.NET 数据服务?那是为了通过实体框架访问数据库,两者之间几乎没有逻辑。
  • 不幸的是,不使用 IIS 是一项要求。而且我知道 ADO.NET 不是 HTTP 库。 :) 算了,我已经知道我们可以在 vNext 中使用 System.Data.SqlClient 命名空间/包。
【解决方案2】:

在提出问题时,我们已经决定使用 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 中提供的其他值呈现此剃刀模板。对于剃刀模板的渲染,使用RazorEngine

    [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);
        }
    } 

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多