Skip to content

控制器定义

Henry edited this page Sep 10, 2019 · 1 revision

组件定义控制器没有特别的规则,只需在类上添加[Controller]描述,组件在加载的时候就会解释相关方法

定义

    [Controller]
    public class Home
    {
        /// <summary>
        /// Hello Word
        /// </summary>
        /// <param name="name">string:  you name</param>
        /// <returns>string</returns>
        public object Hello(string name)
        {
            return new { Hello = "hello " + name, Time = DateTime.Now };
        }
    }

默认控制器对应的根路径是/,如果需要指定根路径可以通过BaseUrl属性指定

指定根路径

[Controller(BaseUrl = "/admin/blog")]

针对该控制器下的所有访问方式路径是/admin/blog/xxxx

实例方式

默认情况下控制器都是单实例的,如果希望控制器每次请求都不同实例,可以通过SingleInstance属性来设置

[Controller(SingleInstance =false)]

排除方法

组件默认情况下是把所有public的方法都映射到Url上,如果希望某些方法不想提供Url访问,可以给方法打上以下属性

[NotAction]
public void Init(HttpApiServer server, string path);

异步方法

组件支持通过async/await的方法来支持异步方法的定义,定义如下:

public async Task<TextResult> TestTask(IHttpContext context)
{
      var result = new TextResult("Hello, World!");
      await Task.Delay(1000);
      return result;
}

方法限流

组件支持对方法进行一个限流设置,配置如下:

        [RequestMaxRPS(100)]
        public Employee EmployeeGet(int id)
        {
            Employee result = DataHelper.Defalut.Employees.Find(e => e.EmployeeID == id);
            if (result == null)
                result = new Employee();
            return result;
        }

以上配置最大的RPS100

定义初始化方法

有些时候需要在控制器加载前需要初始化,这个时候只需要实现一个接口,组件在加载控制器的时候就会执行对应接口的方法

    [Controller]
    public class Rewrite : IController
    {
        [NotAction]
        public void Init(HttpApiServer server, string path)
        {
            server.Options.StaticResurceCacheTime = 60 * 5;
            server.UrlRewrite.Add("/cate/{0}.html", "/index.html", "html")
                .Add("/search/{0}.html", "/index.html", "html")
                 .Add("/tag/{0}.html", "/index.html", "html")
                  .Add("/blog/{0}.html", "/blog.html", "html")
                  .Add("/photos/{0}.html", "/photos.html", "html");
            server.HttpRequestNotfound += (o, e) =>
            {
                e.Cancel = true;
                e.Response.Result(new Move302Result("/product.html"));
            };
            server.ResourceCenter.FileResponse += (request, e) =>
            {
                if (e.Request.Ext == "jpg" || e.Request.Ext == "png")
                {
                    if (!server.Options.Debug)
                    {
                        int time = 600000;
                        if (Regex.IsMatch(e.Request.BaseUrl, @"/images/\d+/.*"))
                        {
                            time = time * 1000;
                        }
                        e.Response.Header.Add(HeaderTypeFactory.CACHE_CONTROL, "public, max-age=" + time);
                    }
                }
            };
        }
    }