如何使用自定义标头进行AJAX POST跨域

2024-03-23

我四处寻找,但找不到明确的答案。

我需要能够执行 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 的网站进行了测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用自定义标头进行AJAX POST跨域 的相关文章

随机推荐

  • AspectJ 编织 Maven 模块

    我有一个项目 有多个 Maven 模块 其中之一包含我的方面 我如何获取各个方面并编织多个 Maven 模块 AspectJ Maven 插件的文档有点稀疏 无法找到很多示例 我尝试将aspectj 插件放入父pom 中 但它似乎没有应用其
  • 如何将 Excel 工作簿写入 .NET 中的 MemoryStream?

    如何将 Excel 工作簿写入MemoryStream而不先将其保存到文件系统 内的所有选项Microsoft Office Interop Excel WorkBook保存选项采用文件名 我对 PIA 以及将 Excel 文件存储在文档存
  • “OneHotEncoder”对象没有属性“get_feature_names”

    我正在尝试使用 scikit learn 的 OneHotEncoder 对象的 get feature names 函数提取特征 但它向我抛出一个错误 OneHotEncoder 对象没有属性 get feature names 下面是代
  • 带/不带类的回调函数指针 C++

    我被困 我正在尝试形成一个函数 它将吃掉无类函数指针和对象中的函数指针 这是我当前的代码 希望能解释更多 它应该在 Arduino 上运行 所以我不能使用大型库 首先 我在 Arduino 上使用这个库 SimpleTimer A time
  • Flyway 仅在我的 jar 文件中找不到迁移

    我有类似的问题this https stackoverflow com questions 11226070 flyway not finding the migrations in a jar file但我已经迁移到版本 2 1 1 问题
  • 在应用程序和 Web 之间共享数据库

    我参与了一个必须从现有数据库检索查询的应用程序 该数据库必须在远程服务器中的 php 中实现 并且将是管理员必须将内容插入共享数据库的地方 但我不知道如何正确实现或什么是最佳解决方案 我正在考虑使用 php 创建一个 sqlite 数据库并
  • ld:找不到 -lIOKit.A clang xcode 的库

    我使用项目的 Target 部分将 libIOKit A dylib 库包含到我的 Xcode 项目中 如下图所示 该项目已构建并运行良好 我在编译状态中遇到一些有线错误 ld 找不到 lIOKit 的库 A clang 错误 链接器命令
  • 将 Entity Framework Data First 与 ODBC 和 MySQL 结合使用

    我怎样才能创建一个ADO NET 实体数据模型使用 ODBC 连接 MySQL 我在本地主机上安装了 MySQL 3 51 ODBC 驱动程序 并创建了一个测试 MySQL 数据库 然后使用 VS2013 我使用 ODBC 数据源创建到我的
  • 如何从函数中实时捕获打印内容?

    我想捕捉所有prints 并执行诸如返回它们之类的操作 但继续运行该函数 我找到了这个方法 但它只返回print代码完成后 f io StringIO with redirect stdout f my code return f getv
  • Lua:setfenv() 与 _ENV

    Lua 切换有什么大不了的setfenv to ENV 在各种 新增内容 资料中 这一举措被认为是 Lua 5 1 和 5 2 版本之间最重要的变化之一 但是 PIL 和其他地方给出的示例可以修剪为以下内容 Lua 5 1 Lua 5 2
  • 提交了我的 php 表单,但没有发送任何值

    由于某种原因 这些选项没有显示在我的电子邮件中 我可以很好地发送电子邮件 我可以看到正文及其所有评论 但看不到用户所做的任何条目 我知道我做错了什么 但我无法确定它是什么 另外 如果它看起来很糟糕 请随意嘲笑我 ToEmail email
  • 可以使用存储过程中的动态 SQL 创建 MySQL 触发器吗?

    是否可以使用从存储过程中动态生成的 SQL 在 MySQL 中创建触发器 我通过准备语句在过程中执行其他动态构造的查询 但是当我尝试使用相同的方法创建触发器时 出现以下错误 错误代码 1295 准备好的语句协议尚不支持此命令 From Bu
  • Grepping 查找重叠的模式匹配

    这就是我正在运行的 grep o tcb lt lt lt r t c q c b b 输出是 t b 但我想得到 t c b 我不希望匹配没有前面的 b 或没有后面的 c 因为 tcb 应该在 r t c q b b r t c q b
  • 连接的 Delphi 字符串是否保存在保留对该字符串的引用的隐藏临时变量中?

    我试图了解 Delphi 服务器应用程序中的内存问题 最初我怀疑存在彻底的泄漏 但现在相信我们看到内存挂起的时间比应有的时间长 因为编译器在用 动态连接字符串时使用了隐藏的临时值 导致痛苦的自由空间内存碎片 背景 这是 Windows 上的
  • git:为什么 git diff 没有显示任何差异?

    如果我在我的存储库上运行 git status 它会给出 On branch master Changes to be committed use git reset HEAD
  • 如何静态识别动态堆分配?

    我即将在我的应用程序中删除 尽可能多的 动态堆分配 我想知道如何确保我没有错过任何内容 目前 我正在寻找一种方法来轻松甚至自动判断代码的任何 或哪些 部分可能会调用以下标准实现new delete or malloc free无需动态跟踪分
  • 在 Spring Webflux 中禁用给定路径的身份验证和 csrf?

    我想为除一个 url 之外的整个应用程序启用 oauth2 我的配置 EnableWebFluxSecurity class SecurityConfig Bean fun securityWebFilterChain http Serve
  • Visual Studio 2012 - “添加”上下文菜单的项模板

    我成功创建新的项模板并将其添加到 Visual Studio 2012 现在我可以使用右键单击来创建新项目 解决方案资源管理器 添加 新项目 dialog But how I can add this Item Template to ap
  • 如何比较 Git 存储库中的源与 SVN 存储库中的源

    如何比较两种不同存储库类型中的代码 Git 存储库不是从 SVN 存储库获取的 Thanks 将它们都检查到磁盘并使用类似的工具无可比拟 http www scootersoftware com
  • 如何使用自定义标头进行AJAX POST跨域

    我四处寻找 但找不到明确的答案 我需要能够执行 AJAX POST 并发送自定义标头 我可以完全控制客户端脚本和服务器端服务 因此 如果我必须对任一侧进行任何调整才能使其正常工作 我就可以进行这些更改 我目前正在使用 jQuery 但是如果