目前WebApi在使用上大部分都是跟MVC组合的,而且使用起来也确实十分便利。
但有时候我们也需要在WebForm中使用WebApi,二者还是有一定区别的。
首先看下结构
①ApiController
即Controller部分,当然也包含Api的路径也是很重要的。这里面是Api/{function}/{controller}/{action}
看一下Controller里面的内容
using System; using System.Web.Http; namespace WebApiTest.Api.Func { public class TestController : ApiController { [HttpPost] public TestModel Post([FromBody]TestModel model) { model.Name = "Post"; model.UpdatedOn = DateTime.Now; model.Age++; return model; } } }
注意的地方有这么几点:
- Controller要继承ApiController
- Action要加上特性 [HttpPost] ,[HttpGet] 。。。如下图
- 一般情况我们用的都是[HttpPost],这时候参数中就要加特性[FromBody]了
- 为了能够直接使用请求过来的数据,而不必去转化成对应的实体类,我们需要给参数实体类加特性[Newtonsoft.Json.JsonObject]否则返回的数据会是酱紫的
这是使用的实体类
[Newtonsoft.Json.JsonObject] public class TestModel { public string Name { set; get; } public int Age { set; get; } public DateTime UpdatedOn { set; get; } }
②跨域处理程序CorsHandler.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Net.Http; 6 using System.Threading.Tasks; 7 using System.Threading; 8 using System.Net; 9 10 namespace WebApiTest.Handler 11 { 12 public class CorsHandler : DelegatingHandler 13 { 14 const string Origin = "Origin"; 15 const string AccessControlRequestMethod = "Access-Control-Request-Method"; 16 const string AccessControlRequestHeaders = "Access-Control-Request-Headers"; 17 const string AccessControlAllowOrigin = "Access-Control-Allow-Origin"; 18 const string AccessControlAllowMethods = "Access-Control-Allow-Methods"; 19 const string AccessControlAllowHeaders = "Access-Control-Allow-Headers"; 20 21 protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 22 { 23 bool isCorsRequest = request.Headers.Contains(Origin); 24 bool isPreflightRequest = request.Method == HttpMethod.Options; 25 if (isCorsRequest) 26 { 27 if (isPreflightRequest) 28 { 29 return Task.Factory.StartNew<HttpResponseMessage>(() => 30 { 31 HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); 32 response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First()); 33 34 string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault(); 35 if (accessControlRequestMethod != null) 36 { 37 response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod); 38 } 39 40 string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders)); 41 if (!string.IsNullOrEmpty(requestedHeaders)) 42 { 43 response.Headers.Add(AccessControlAllowHeaders, requestedHeaders); 44 } 45 46 return response; 47 }, cancellationToken); 48 } 49 else 50 { 51 return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t => 52 { 53 HttpResponseMessage resp = t.Result; 54 resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First()); 55 return resp; 56 }); 57 } 58 } 59 else 60 { 61 return base.SendAsync(request, cancellationToken); 62 } 63 } 64 } 65 }