CrosHandler.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System.Linq;
  2. using System.Net;
  3. using System.Net.Http;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. namespace Lottomat.SOA.API.Handlers
  7. {
  8. /// <summary>
  9. /// 解决自定义请求头下的跨域问题
  10. /// <example>调用方式:在Global.asax文件的Application_Start方法添加GlobalConfiguration.Configuration.MessageHandlers.Add(new CrosHandler());</example>
  11. /// </summary>
  12. public class CrosHandler : DelegatingHandler
  13. {
  14. private const string Origin = "Origin";
  15. private const string AccessControlRequestMethod = "Access-Control-Request-Method";
  16. private const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
  17. private const string AccessControlAllowOrign = "Access-Control-Allow-Origin";
  18. private const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
  19. private const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";
  20. private const string AccessControlAllowCredentials = "Access-Control-Allow-Credentials";
  21. protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  22. {
  23. bool isCrosRequest = request.Headers.Contains(Origin);
  24. //是否预请求
  25. bool isPrefilightRequest = request.Method == HttpMethod.Options;
  26. if (isCrosRequest)
  27. {
  28. Task<HttpResponseMessage> taskResult = null;
  29. if (isPrefilightRequest)
  30. {
  31. taskResult = Task.Factory.StartNew<HttpResponseMessage>(() =>
  32. {
  33. HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Accepted);
  34. response.Headers.Add(AccessControlAllowOrign, request.Headers.GetValues(Origin).FirstOrDefault());
  35. string method = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
  36. if (!string.IsNullOrEmpty(method))
  37. {
  38. response.Headers.Add(AccessControlAllowMethods, method);
  39. }
  40. string headers = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
  41. if (!string.IsNullOrEmpty(headers))
  42. {
  43. response.Headers.Add(AccessControlAllowHeaders, headers);
  44. }
  45. response.Headers.Add(AccessControlAllowCredentials, "true");
  46. return response;
  47. }, cancellationToken);
  48. }
  49. else
  50. {
  51. taskResult = base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>
  52. {
  53. var response = t.Result;
  54. response.Headers.Add(AccessControlAllowOrign, request.Headers.GetValues(Origin).FirstOrDefault());
  55. response.Headers.Add(AccessControlAllowCredentials, "true");
  56. return response;
  57. }, cancellationToken);
  58. }
  59. return taskResult;
  60. }
  61. return base.SendAsync(request, cancellationToken);
  62. }
  63. }
  64. }