Windows Service中创建WebAPI

1,创建Windows Service;

2,使用NuGet 添加 安装三个组件,其他组件会随着这三个组件的安装自动安装;(管理解决方案的NuGet程序包)

4,基本配置、注册服务


    class Program
    {
        static void Main(string[] args)
        {
            Console.ReadLine();
            Host host = HostFactory.New(x =>
            {          // 基本的配置
                x.RunAsLocalSystem();
                x.SetServiceName("Service");
                x.SetDisplayName("Service");
                x.SetDescription("服务");
                x.StartAutomatically();
                x.EnableShutdown();
                // 注册服务
                x.Service<Service>(hostSettings => new Service());

                // 设置服务失败后的操作,分别对应第一次、第二次、后续
                x.EnableServiceRecovery(t =>
                {
                    t.RestartService(0);

                    t.RestartService(0);

                    t.RestartService(0);

                    t.OnCrashOnly();
                });
            });

            host.Run();
        }
    }

 5,注册路由


    public class RegisterRoutesStartup
    {
        public void Configuration(IAppBuilder appBuilder)
        {
            HttpConfiguration config = new HttpConfiguration();
            //自定义路由
            config.Routes.MapHttpRoute(
              name: "DefaultApi",
              routeTemplate: "socketApi/{controller}/{action}/{id}",
              defaults: new { id = RouteParameter.Optional }
            );
            //只响应Json请求
            var jsonFormatter = new JsonMediaTypeFormatter();
            config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
            appBuilder.UseWebApi(config);
        }
    }

    public class JsonContentNegotiator : IContentNegotiator
    {
        private readonly JsonMediaTypeFormatter jsonMediaTypeFormatter;

        public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
        {
            this.jsonMediaTypeFormatter = formatter;
        }

        public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
        {
            var result = new ContentNegotiationResult(this.jsonMediaTypeFormatter, new MediaTypeHeaderValue("application/json"));
            return result;
        }
    }

6,创建Service


    public class Service : ServiceControl
    {
        private string hostSocket;
        private IDisposable hostObject;

        public bool Start(HostControl hostControl)
        {
            //hostSocket = Const.GetIpAddress();

            hostObject = WebApp.Start<RegisterRoutesStartup>("http://localhost:8088");
            // 开始具体的业务逻辑
            return true;
        }

        public bool Stop(HostControl hostControl)
        {
            // 结束
            hostObject.Dispose();
            return true;
        }
    }

7,创建跨域属性


    public class CrossSiteAttribute : System.Web.Http.Filters.ActionFilterAttribute
    {
        private const string Origin = "Origin";
        /// <summary>
        /// Access-Control-Allow-Origin是HTML5中定义的一种服务器端返回Response header,用来解决资源(比如字体)的跨域权限问题。
        /// </summary>
        private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
        /// <summary>
        ///  originHeaderdefault的值可以使 URL 或 *,如果是 URL 则只会允许来自该 URL 的请求,* 则允许任何域的请求
        /// </summary>
        private const string originHeaderdefault = "*";
        /// <summary>
        /// 该方法允许api支持跨域调用
        /// </summary>
        /// <param name="actionExecutedContext"> 初始化 System.Web.Http.Filters.HttpActionExecutedContext 类的新实例。</param>
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin, originHeaderdefault);
        }
    }

8,简单建立一个测试的API


    [CrossSite]
    public class DemoController : ApiController
    {
        /// <summary>
        /// 访问 http://localhost:8088/socketApi/Demo/Test/1
        /// socketApi/{controller}/{action}/{id}
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Test(string id)
        {
            return id+",Are you ok?";
        }
    }

[CrossSite]尤其重要,以此来标识是否支持跨域访问.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Julin.Zou

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值