我到处环顾四周,但找不到确切的答案。
我需要能够执行AJAX POST并发送自定义标头。我对客户端脚本和服务器端服务都具有完全控制权,因此,如果需要对任何一方进行任何调整才能进行此工作,则可以进行这些更改。
我目前正在使用jQuery,但是,如果jQuery无法做到这一点,并且我需要使用另一个完全没有问题的库。理想情况下,我宁愿坚持使用单个库(jQuery),但如果能解决我的问题,我很乐意使用第二个库。
目前,我的代码如下所示:
$.ajax({ type: 'POST', url: 'http://localhost:65079/TestHandler', crossDomain: true, data: myVariableOfData, dataType: 'json', beforeSend: function(xhr) { xhr.setRequestHeader('MessageId', 'abc123'); }, success: function(responseData, textStatus, messageId) { console.log("success"); }, error: function(responseData, textStatus, errorThrown) { console.log(textStatus); console.log(responseData); console.log(errorThrown); } });
不幸的是,jQuery甚至没有尝试将请求发送到服务器,但是,一旦我删除了标头,它就会发送请求。我确实需要这些标头,因此我们将不胜感激。
请问我任何可能有助于解决此问题的问题,我将尽我所能尽快做出答复。
我不知道您是否还在寻找实现此目的的方法。可以做到的。这是一个示例CORS处理程序
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Api.Handlers { /// <summary> /// /// </summary> public class CorsHandler : DelegatingHandler { const string Origin = "Origin"; const string AccessControlRequestMethod = "Access-Control-Request-Method"; const string AccessControlRequestHeaders = "Access-Control-Request-Headers"; const string AccessControlAllowOrigin = "Access-Control-Allow-Origin"; const string AccessControlAllowMethods = "Access-Control-Allow-Methods"; const string AccessControlAllowHeaders = "Access-Control-Allow-Headers"; /// <summary> /// /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { bool isCorsRequest = request.Headers.Contains(Origin); bool isPreflightRequest = request.Method == HttpMethod.Options; if (isCorsRequest) { if (isPreflightRequest) { HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First()); string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault(); if (accessControlRequestMethod != null) { response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod); } string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders)); if (!string.IsNullOrEmpty(requestedHeaders)) { response.Headers.Add(AccessControlAllowHeaders, requestedHeaders); } TaskCompletionSource<HttpResponseMessage> tcs = new TaskCompletionSource<HttpResponseMessage>(); tcs.SetResult(response); return tcs.Task; } return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t => { HttpResponseMessage resp = t.Result; resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First()); return resp; }); } return base.SendAsync(request, cancellationToken); } } }
添加此代码后,然后在Application_Start方法内的Global.asax文件中注册处理程序。
GlobalConfiguration.Configuration.MessageHandlers.Add(new CorsHandler());
现在,您可以发送请求标头。希望有帮助。已通过Web API,MVC 4以及来自Google Chrome和Firefox的站点进行了测试。