(一)Asp.net WebApi自定义Filter(过滤器)
一、新建一个Asp.net WebApi项目:
添加一个类:MyAuthoFilter继承自IAuthorizationFilter,如下:(下面这个过滤器是判断请求头中关键字UserName是否为admin)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace WebApplication1
{
public class MyAuthoFilter : IAuthorizationFilter
{
public bool AllowMultiple => true;
public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
IEnumerable<string> userNames;
if(!actionContext.Request.Headers.TryGetValues("UserName", out userNames))
{
return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
string userName = userNames.First();
if(userName == "admin")
{
return await continuation();
}
else
{
return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
}
}
}
二、在App_Start文件夹中的WebApiConfig.cs中添加config.Filters.Add(new MyAuthoFilter());如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace WebApplication1
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Filters.Add(new MyAuthoFilter());
}
}
}
三、ValuesController控制器内容不用动,如下:
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public void Post([FromBody] string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody] string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
四、最后,我们可以新建一个Winform客户端,添加一个按钮,在里面访问web api接口:
private void button1_Click(object sender, EventArgs e)
{
var uri = new Uri("https://localhost:44392/api/values");
var client = new HttpClient();
client.DefaultRequestHeaders.Add("UserName", "admin");
var result = client.GetAsync(uri).Result;
var str = result.Content.ReadAsStringAsync().Result;
textBox1.Text = str;
}
此处会返回结果:[“value1”,“value2”]