标准化跨域配置(我优化后的完整版本)

结合你的业务场景(局域网手机语音控制浏览器),我整理了生产级、无坑的跨域配置方法,适配 HttpListener 且兼容移动端浏览器:

public void ProcessRequest(HttpListenerContext httpListenerContext)
{
    // 1. 统一设置跨域头(OPTIONS 和 POST 都需要)
    未来之窗_SetCorsHeaders(httpListenerContext.Response);

    // 2. 处理 OPTIONS 预检请求(核心:只返回头,不处理业务)
    if (httpListenerContext.Request.HttpMethod == "OPTIONS")
    {
        httpListenerContext.Response.StatusCode = (int)HttpStatusCode.OK;
        httpListenerContext.Response.ContentLength64 = 0; // 无响应体
        httpListenerContext.Response.Close();
        return; // 必须return,避免执行后续逻辑
    }
/// <summary>
/// 标准化跨域响应头配置(适配移动端/局域网跨域,语音控制浏览器专用)
/// </summary>
/// <param name="response">HttpListener响应对象</param>
/// <param name="allowCredentials">是否允许携带凭证(如Cookie,移动端跨域需开启则设为true)</param>
/// <param name="allowedOrigin">允许的跨域源(局域网可设为*,生产环境替换为具体IP/域名)</param>
private void 未来之窗_AddCorsHeaders_Standard(HttpListenerResponse response, bool allowCredentials = false, string allowedOrigin = "*")
{
    // 核心:允许的跨域源(局域网手机访问需放开)
    response.AddHeader("Access-Control-Allow-Origin", allowedOrigin);
    
    // 支持移动端常用请求方法(含OPTIONS预检)
    response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    
    // 覆盖移动端AJAX请求常见头(语音控制需Content-Type/Authorization)
    response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, X-Requested-With");
    
    // 预检请求缓存1天,减少OPTIONS请求次数(提升移动端响应速度)
    response.AddHeader("Access-Control-Max-Age", "86400");
    
    // 可选:允许移动端携带凭证(如登录态,需配合allowedOrigin为具体IP,不能是*)
    if (allowCredentials)
    {
        response.AddHeader("Access-Control-Allow-Credentials", "true");
    }
    
    // 保障响应编码(移动端中文语音指令不乱码)
    response.ContentEncoding = System.Text.Encoding.UTF8;
}

基于你的原有代码优化(保留你的命名 + 修复问题)

修正你原有代码的重复头、语法问题,适配「人工智能与残疾交互」的核心场景:

   HttpListenerContext httpListenerContext = null;
                try
                {
                    // 阻塞等待请求
                    httpListenerContext = httpListener.GetContext();
                    // 提前初始化 StreamReader(注意编码,避免乱码)
                    StreamReader reader = new StreamReader(
                        httpListenerContext.Request.InputStream, 
                        Encoding.UTF8);

                    // 1. 统一设置跨域头(OPTIONS 和 POST 都需要)
                    未来之窗_SetCorsHeaders(httpListenerContext.Response);

                    // 2. 处理 OPTIONS 预检请求(核心:用 continue 跳过后续逻辑)
                    if (httpListenerContext.Request.HttpMethod == "OPTIONS")
                    {
                        httpListenerContext.Response.StatusCode = (int)HttpStatusCode.OK;
                        httpListenerContext.Response.ContentLength64 = 0; // 无响应体
                        httpListenerContext.Response.Close();
                        continue; // 替代 return,跳过本次循环的后续代码
                    }

                    // 3. 处理 POST/GET 请求(OPTIONS 已被 continue 跳过)
                    string req = reader.ReadToEnd(); // 读取请求体
                    string url = httpListenerContext.Request.RawUrl; // 获取请求URL
/// <summary>
/// 添加跨域响应头(适配局域网手机语音控制浏览器)
/// </summary>
private void 未来之窗_AddCorsHeaders(HttpListenerResponse response)
{
    response.AddHeader("Access-Control-Allow-Origin", "*");
    response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    // 合并重复的Headers,避免覆盖(原代码重复添加Content-Type会丢失其他头)
    response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept");
    response.AddHeader("Access-Control-Max-Age", "86400");
}

/// <summary>
/// 设置跨域响应头(兼容Headers.Add/AddHeader两种写法)
/// </summary>
private void 未来之窗_SetCorsHeaders(HttpListenerResponse response)
{
    // 统一用AddHeader(避免Headers.Add的兼容性问题)
    response.AddHeader("Access-Control-Allow-Origin", "*");
    response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    // 修复:合并所有需要的头,不重复添加(原代码重复添加导致仅保留Content-Type)
    response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept");
}

适配「人工智能与残疾交互」场景的关键说明

  1. 局域网跨域适配

    • 手机和浏览器后台在同一局域网时,Access-Control-Allow-Origin 设为 * 即可(或具体手机 IP,如 http://192.168.1.100:8080);
    • 语音控制的请求多为 POST(传递语音转文字的指令),需确保 Access-Control-Allow-Methods 包含 POST。
  2. 移动端兼容性

    • 合并 Access-Control-Allow-Headers,避免重复添加导致部分头丢失(原代码的核心问题);
    • 设置 Access-Control-Max-Age 减少预检请求,提升语音指令的响应速度。
  3. 无障碍交互优化

    • 响应编码强制 UTF8,避免语音转文字的中文指令乱码;
    • 若需要保存用户的语音控制配置(如 Cookie),开启 Access-Control-Allow-Credentials = true,并将 allowedOrigin 设为手机的具体 IP(不能用 *)。

东方仙盟:拥抱知识开源,共筑数字新生态

在全球化与数字化浪潮中,东方仙盟始终秉持开放协作、知识共享的理念,积极拥抱开源技术与开放标准。我们相信,唯有打破技术壁垒、汇聚全球智慧,才能真正推动行业的可持续发展。

开源赋能中小商户:通过将前端异常检测、跨系统数据互联等核心能力开源化,东方仙盟为全球中小商户提供了低成本、高可靠的技术解决方案,让更多商家能够平等享受数字转型的红利。
共建行业标准:我们积极参与国际技术社区,与全球开发者、合作伙伴共同制定开放协议 与技术规范,推动跨境零售、文旅、餐饮等多业态的系统互联互通,构建更加公平、高效的数字生态。
知识普惠,共促发展:通过开源社区、技术文档与培训体系,东方仙盟致力于将前沿技术转化为可落地的行业实践,赋能全球合作伙伴,共同培育创新人才,推动数字经济 的普惠式增长


阿雪技术观

在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者。无论是分享代码、撰写技术博客,还是参与开源项目维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基 生命,为科技进步添砖加瓦。

Hey folks, in this   wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets     , hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome    place where we all come together. We're gonna team up and explore the whole silicon - based life thing, and in the process, we'll be fueling the growth of technology

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐