目前WebApi在使用上大部分都是跟MVC组合的,而且使用起来也确实十分便利。

但有时候我们也需要在WebForm中使用WebApi,二者还是有一定区别的。

首先看下结构

Asp.Net实现WebApi跨域 (非MVC)

 ①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] 。。。如下图
  • Asp.Net实现WebApi跨域 (非MVC)
  • 一般情况我们用的都是[HttpPost],这时候参数中就要加特性[FromBody]了
  • 为了能够直接使用请求过来的数据,而不必去转化成对应的实体类,我们需要给参数实体类加特性[Newtonsoft.Json.JsonObject]否则返回的数据会是酱紫的Asp.Net实现WebApi跨域 (非MVC)

这是使用的实体类

[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 }
CorsHandler.cs

相关文章: