乐言-连 2025-12-10 14:29 采纳率: 48.5%
浏览 11
已结题

web页面调用本地服务,跨域问题如何解决.

web页面调用本地服务,跨域问题如何解决。
我本地使用winform监听127.0.0.1:5000。然后去触发一些操作。

img

我网上搜索也处理了CORS 头。

img


但是网页上请求127.0.0.1:5000,出现了跨域问题。这个要如何解决。

img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-12-10 14:43
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    跨域问题解决方案

    你遇到的跨域问题是因为浏览器的同源策略限制了从一个源加载的文档或脚本试图访问另一个源的资源。你的 WinForm 服务监听在 127.0.0.1:5000,而网页请求也在 127.0.0.1:5000,但浏览器认为这是两个不同的源,因为它们使用了不同的协议(http 和 https)。

    解决方案

    1. 使用 CORS 头: 你已经处理了 CORS 头,这是正确的步骤。
    2. 使用 JSONP: JSONP(JSON with Padding)是一种老式的跨域解决方案,它通过在请求中添加一个回调函数来绕过同源策略。
    3. 使用 WebSocket: WebSocket 是一种实时通信协议,它可以绕过同源策略。
    4. 使用代理服务器: 你可以在本地部署一个代理服务器,代理请求从网页到 WinForm 服务。
    5. 使用 Ngrok: Ngrok 是一个开源的反向代理工具,它可以将本地服务暴露给外部世界。

    核心代码

    如果你选择使用代理服务器,核心代码如下:

    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    
    public class ProxyServer
    {
        public static void Main(string[] args)
        {
            var server = new HttpListener();
            server.Prefixes.Add("http://localhost:5001/");
            server.Start();
    
            Console.WriteLine("Proxy server started.");
    
            while (true)
            {
                var context = server.GetContextAsync().Result;
                var request = context.Request;
                var response = context.Response;
    
                var url = request.Url;
                var method = request.HttpMethod;
    
                // 代理请求到 WinForm 服务
                var client = new HttpClient();
                var result = client.SendAsync(new HttpRequestMessage(method, url.AbsoluteUri)).Result;
    
                // 返回代理结果
                response.StatusCode = result.StatusCode;
                response.StatusDescription = result.ReasonPhrase;
                var buffer = result.Content.ReadAsByteArrayAsync().Result;
                response.ContentLength64 = buffer.Length;
                var output = response.OutputStream;
                output.Write(buffer, 0, buffer.Length);
                output.Close();
            }
        }
    }
    

    这个代理服务器监听在 localhost:5001,代理请求从网页到 WinForm 服务。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月10日
  • 创建了问题 12月10日