50、Windows服务中对外提供Web Api接口

本文详细介绍如何在ASP.NET Web API中自定义JSON内容协商器,实现仅响应JSON请求的功能。通过创建JsonContentNegotiator类和RegisterRoutesStartup类,结合使用Nuget包如Microsoft.AspNet.WebApi.Owin等,实现WebAPI服务的定制化启动和路由配置。
摘要由CSDN通过智能技术生成

引入依赖

在通过Nuget包管理器安装如下组件

   Microsoft.AspNet.WebApi.Owin

   Microsoft.Owin.Hosting   

   Microsoft.Owin.Host.HttpListener

                                                                                                                               

1、创建 JsonContentNegotiator 类

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

2、创建 RegisterRoutesStartup 类

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

3、在服务(Service1)中启动WebApi

    public partial class Service1 : ServiceBase
    {
        private string hostSocket;
        private IDisposable hostObject;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            hostSocket = Const.GetIpAddress();

            hostObject = WebApp.Start<RegisterRoutesStartup>("http://" + hostSocket + ":" + Const.GetAppSetting("portObject"));

        }

        protected override void OnStop()
        {
            hostObject.Dispose();
        }
    }

4、创建 Const 类

    public class Const
    {
        public static string GetAppSetting(string key)
        {
            foreach(string item in ConfigurationManager.AppSettings)
            {
                if(key == item)
                {
                    return ConfigurationManager.AppSettings[item];
                }
            }
            return "";
        }

        public static string GetIpAddress()
        {
            string ip = string.Empty;
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                {
                    if ("127.0.0.1" == _IPAddress.ToString())
                    {
                        continue;
                    }
                    else
                    {
                        ip = _IPAddress.ToString();
                        break;
                    }
                }
            }
            return ip;
        }

    }

5、最后创建 WebApi 类

    public class DemoController : ApiController
    {
        /// <summary>
        /// 访问 http://host:port/socketApi/Demo/Test
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Test()
        {
            return "Are you ok?";
        }
    }

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值