我到处都找不到确切的答案。
我需要能够执行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网站进行了测试。
冒着听起来完全像Siri的风险,听起来像是在寻找如何让CORS工作。。。
以下是一些有望有所帮助的资源:
- 如何使跨来源资源共享(CORS)请求后工作
- CORS工作
- 跨来源资源共享演示
- 具有跨域资源共享的跨域Ajax