使用剃刀实现模板化服务

时间:2014-11-13 10:56:01

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

在提出问题时,我们决定选择使用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属性,该对象包含razor tempalte的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);
        }
    }