C#之浏览器请求跨域

1 现象

需求:A项目的页面需要调用B项目的接口(接口项目)并获取响应的数据。

方法:所以在A项目的页面中使用AJAX直接调用对应的接口获取数据。
问题:浏览器使用AJAX请求非本项目的接口是存在跨域问题。
截图:

2 解决

方法:在A项目中创建一个.ashx文件(一般处理程序),作为通讯层,接收页面请求,
然后将请求转发给B项目,在获取B项目的返回值后,将返回值发给页面。

3 代码

A项目的通讯层代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.IO;

namespace LY.DRCM.WEBSITE.Handler
{
    /// <summary>
    /// DataHandler 的摘要说明
    /// </summary>
    public class DataHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {

            HttpResponse hResponse = context.Response;//HTTP响应消息
            HttpRequest hRequest = context.Request;//HTTP请求消息
            string param = (string)hRequest["param"];//获取请求参数
            
            //创建http请求
            string url = "http://localhost:38193/Handler.ashx?param=" + param;
            //发送请求
            WebRequest request = HttpWebRequest.Create(url);
            //设置为POST请求
            request.Method = "POST";
            //获取响应对象
            WebResponse response = request.GetResponse();
            Stream responeBody = response.GetResponseStream();
            using (StreamReader reader = new StreamReader(responeBody))
            {
                result = reader.ReadToEnd();
            }
            context.Response.ContentType = "text/plain";
            context.Response.Clear();
            context.Response.Write(result);
            context.Response.End();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

代码分析:
HttpRequest类:使ASP.NET能够读取客户端在Web请求期间发送的HTTP值。
WebRequest类:发出对统一资源标识符(URL)的请求。这是一abstract类。
Stream类:流。
StreamReader类:实现一个TextReader,使其以一种特定的编码从字节流中读取字符。

A项目通讯层代码-使用POST:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.IO;

namespace LY.DRCM.WEBSITE.Handler
{
    /// <summary>
    /// DataHandler 的摘要说明
    /// </summary>
    public class DataHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            HttpRequest hRequest = context.Request;//HTTP请求消息
            string param = (string)hRequest["param"];//获取请求参数

            //发送POST请求
            string url = "http://localhost:38193/Handler.ashx";
            WebRequest request = HttpWebRequest.Create(url);
            request.Method = "POST";
            StreamWriter myStreamWriter = new StreamWriter(request.GetRequestStream());
            myStreamWriter.Write(param);
            myStreamWriter.Close();

            //获取响应对象
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader myStreamReader = new StreamReader(response.GetResponseStream());
            string resultResponse = myStreamReader.ReadToEnd();
            myStreamReader.Close();

            //输出响应结果
            context.Response.ContentType = "text/plain";
            context.Response.Clear();
            context.Response.Write(resultResponse);
            context.Response.End();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}



<think>嗯,用户的问题是关于在C#中处理POST请求时的限制,需要CORS配置示例。首先,我需要回忆一下CORS的基本概念和相关配置方法。根据用户提供的引用,特别是引用[1]和[4],后端需要设置响应头中的Access-Control-Allow-Origin、Access-Control-Allow-Credentials等字段。同时,预检请求(OPTIONS方法)的处理也很重要,因为POST请求可能会触发预检。 接下来,用户使用的是C#,所以可能需要考虑ASP.NET Core或者传统的ASP.NET(如Web API)的解决方案。我需要分别针对这两种情况给出配置示例。 对于ASP.NET Core,通常是在Startup.cs文件中配置CORS策略。需要添加CORS服务,然后配置中间件,允许特定的来源、方法和头信息。记得设置AllowCredentials()如果需要携带凭证,如Cookie,同时要注意不能使用通配符*作为来源,必须指定明确的名,如引用[3]提到的。 如果是传统的ASP.NET Web API,可能需要在Global.asax中添加处理OPTIONS请求的代码,或者在web.config中配置自定义头。这里可能需要手动设置响应头,或者在控制器中使用属性来启用CORS。 另外,用户的问题中提到POST请求,所以需要确保允许的方法包括POST,并且在预检请求中返回正确的Allow-Methods。例如,在ASP.NET Core中,WithMethods("POST")或者在策略中允许所有方法。 还要注意,当使用凭证时,Access-Control-Allow-Origin不能是通配符,必须明确指定来源,如引用[1]和[3]所述。同时,Access-Control-Allow-Credentials要设为true。 可能还需要处理OPTIONS请求,因为在POST之前,浏览器会发送OPTIONS预检请求,如引用[4]提到。所以,在Web API中可能需要添加一个处理OPTIONS请求的控制器方法,或者配置中间件自动处理。 现在需要将这些思路整理成步骤,给出具体的代码示例,并确保符合用户的环境(C#)。同时,需要检查是否有遗漏的配置项,比如头信息中的其他字段,比如Access-Control-Allow-Headers,是否需要允许特定的头,如Content-Type。 最后,生成相关问题,比如如何处理预检请求,或者如何在其他框架中配置CORS,以帮助用户进一步理解。</think>### 在C#中处理POST请求限制的CORS配置方法 #### 1. ASP.NET Core中的全局配置 在`Startup.cs`中通过中间件配置: ```csharp public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy("AllowSpecificOrigin", policy => { policy.WithOrigins("http://localhost:3000") // 指定允许的源[^1] .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // 允许携带凭证[^1] }); }); } public void Configure(IApplicationBuilder app) { app.UseCors("AllowSpecificOrigin"); // 启用CORS策略 app.UseMvc(); } ``` 此配置允许来自`http://localhost:3000`的POST请求,并支持携带Cookie等凭证。 #### 2. Web API (ASP.NET Framework)中的配置 在`Global.asax.cs`中添加预检请求处理: ```csharp protected void Application_BeginRequest() { if (Request.HttpMethod == "OPTIONS") // 处理OPTIONS预检请求[^4] { Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:3000"); Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); Response.AddHeader("Access-Control-Allow-Headers", "Content-Type"); Response.AddHeader("Access-Control-Allow-Credentials", "true"); Response.End(); } } ``` #### 3. 控制器级别的配置(ASP.NET Core) 通过特性标记单个控制器: ```csharp [EnableCors("AllowSpecificOrigin")] public class ApiController : Controller { [HttpPost] public IActionResult PostData() { return Ok("POST成功"); } } ``` #### 关键注意事项 1. **凭证与通配符限制**:当使用`AllowCredentials()`时,`WithOrigins()`必须指定具体名,不能使用`*`通配符[^3] 2. **预检请求处理**:OPTIONS请求需返回`Access-Control-Allow-Methods`包含POST方法 3. **请求头声明**:若前端包含自定义头,需通过`WithHeaders()`显式声明允许的头信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值