欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

asp.net中的web api使用(非mvc程序)

程序员文章站 2024-02-20 10:46:40
...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Security;
using System.Web.SessionState;

namespace WebApi
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {
            //注册区域(Areas)
            //需要下载这个dll,Microsoft Help Page  ,会自动生成帮助页面,文件存在区域(Areas)
            AreaRegistration.RegisterAllAreas();
            //注册 api 路由 必须写在mvc 路由注册之前否则会找不到。
            //WebApiConfig.Register(GlobalConfiguration.Configuration);

            //WebApiConfig.Register(GlobalConfiguration.Configuration);

            // 使api返回为json,
            //解决这个问题需要在接口函数中设置,如AllRoute()函数,但有个不好的地方,如果返回的结果是String类型,如123,返回的json就会变成"123";
            //这种方式把所有的返回数据都转为json了
            //GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
            //方式二,如只需要设置某一个的函数返回json,见AllRouteJson()


            //使用自定义路由需要这样调用,不然报错
            GlobalConfiguration.Configure(WebApiConfig.Register2);
        }     
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;

namespace WebApi
{
    public class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {

            //开启路由特性
            //config.MapHttpAttributeRoutes();
            //注册路由地址
            config.Routes.MapHttpRoute(
   name: "DefaultApi", //这个可以随意命名
   routeTemplate: "api/{controller}/{action}/{id}",//web api 的地址
   defaults: new { id = RouteParameter.Optional }
   );

        }
        //使用路由特性
        public static void Register2(HttpConfiguration config)
        {
            //开启路由特性
            config.MapHttpAttributeRoutes();
            //注册路由地址
            config.Routes.MapHttpRoute(
   name: "DefaultApi", //这个可以随意命名
   routeTemplate: "api/{controller}/{action}/{id}",//web api 的地址
   defaults: new { id = RouteParameter.Optional }
   );

        }
    }
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Http;
using System.Web.Script.Serialization;

namespace WebApi
{
    /// <summary>
    /// 这是控制器类说明
    /// </summary>
     [RoutePrefix("api1")]  //自定义路由,所有函数加了route标签的路由前加该路径,对不是自定义没加route标签的函数不生效
    public class DomeController: ApiController
    {

     //需要下载这个dll,Microsoft Help Page  ,会自动生成帮助页面,文件存在区域(Areas)

        //帮助文档的设置
        //显示说明文档首先要设置:调试-生成-把xml文档文件选√,然后取消HelpPageConfig类下
        //config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/WebApi.xml")));
        //的行注释,路径改为设置的xml文件输出路径


        //在接口帮助页面显示接口说明,需要在函数前面加 ///描述
        //显示参数说明需要在函数前加描述<param name="参数名">
        //显示接口详情页的返回参数说明,需要加  在变量前加描述 /// <summary>


        /// <summary>
        /// 这是GetId方法
        /// </summary>
        /// <param name="i">变量i</param>
        /// <param name="n">变量n</param>
        /// <returns></returns>
        public DemoModel GetIdAnnotation(int i,int n)
        {
            return new DemoModel {id=1,name="a" };
        }



        //路由规则
        //路由加了action,调用时需要函数名,否则不需要,重载区分调用的函数

        //如果参数是设置的与路由设置的(设置的id)一致,则可以http://localhost:18444/api/Dome/GetIdRoute/1访问
        //否则是http://localhost:18444/api/Dome/GetIdRoute?i=1
        /// <summary>
        /// GetIdRoute
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public string GetIdRoute(int id)
        {
            return "GetIdRoute";
        }

        /// <summary>
        /// getAllRoute
        /// </summary>
        /// <returns></returns>
        //如果函数名不以Get等开头,则要在函数上加[HttpGet]等,不然路由不到
        [HttpGet]
        public HttpResponseMessage AllRoute()
        {
            //设置返回的数据格式
            String userName = "AllRoute";
            HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(userName, Encoding.GetEncoding("UTF-8"), "application/json") };
            return result;
        }
        /// <summary>
        /// 设置返回的数据格式二,序列化后再返回
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public HttpResponseMessage AllRouteJson()
        {
            //返回json格式的数据
            List<DemoModel> dm = new List<DemoModel>() { new DemoModel {id=1,name="name1",set=1},new DemoModel { id=2,name="name2",set=2} };
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            String str = serializer.Serialize(dm);
            HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
            return result;
        }

        //若以Get等开头,则可以用函数名访问:http://localhost:5123/api/Demo/GetSayHello?i=1&s=2
        /// <summary>
        /// GetSayHello
        /// </summary>
        /// 参数名要一致
        /// <param name="i">变量i</param>
        /// <param name="s">变量n</param>
        /// <returns></returns>
        public string GetSayHello(int i,string s)
        {
            return "hello world GetSayHello";
        }

        //{参数变量名称:约束}"来约束路由中的参数变量。
        /// <summary>
        /// 自定义路由特性1
        /// </summary>
        /// <returns></returns>
        [Route("Route/RouteActionName/{name:int?}")]//http://localhost:18444/api1/Route/RouteActionName/1?customerId=2 int?表示可选,int必选
        [HttpGet]
        public string RouteAction(int customerId)
        {
            return "hello world GetSayHello";
        }
        /// <summary>
        /// 自定义路由特性2
        /// </summary>
        /// <returns></returns>
        [Route("Route/{text}/RouteActionName/{text2}")]//http://localhost:18444/Route/1/RouteActionName?customerId=1
        [HttpGet]
        public string RouteAction2(int customerId)
        {
            return "hello world GetSayHello";
        }
        /// <summary>
        /// 自定义路由特性3
        /// </summary>
        /// <param name="text">text</param>
        /// <param name="id">id</param>
        /// <param name="i">i</param>
        /// <returns></returns>
        [Route("Route/{text}/RouteActionName/{text2}/{id}")]//http://localhost:18444/Route/t/RouteActionName/2/h?i=2,url变量与参数变量重叠会不显示参数
        [HttpGet]
        public string RouteAction3(int i,string id)
        {
            return "RouteAction3";
        }
    }
}


//在每个API说明页面的右下角增加一个测试的按钮。
//在Nuget中添加WebApiTestClient。
//在Areas\HelpPage\Views\Help\Api.cshtml添加以下代码:
//  @Html.DisplayForModel("TestClientDialogs")
//  @section Scripts
//{
//      <link type="text/css" href="~/Areas/HelpPage/HelpPage.css" rel="stylesheet" />
//      @Html.DisplayForModel("TestClientReferences")
//这样,就可以显示接口的测试按钮了





using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebApi
{
    public class DemoModel
    {
        /// <summary>
        /// 这是id
        /// </summary>
        public int id { get; set; }

        /// <summary>
        /// 这是名称
        /// </summary>
        public string name { get; set; }

        //这是性别
        public int set { get; set; }
    }
}
相关标签: web api