C#程序调用Express API遇CORS错误求助
C#调用Express API的CORS错误解决方案
问题根源
你的Express CORS配置仅允许白名单内的origin请求,但C#的HttpWebRequest默认不会发送Origin请求头,导致API端获取到的origin值为undefined,不在白名单范围内,触发CORS拦截。而网页浏览器会自动携带当前页面的Origin头,因此能正常通过校验。
推荐解决方案(无需关闭CORS)
修改CORS配置,允许无Origin头的请求(对应非浏览器客户端场景),同时保留原有白名单校验:
const dominiosPermitidos = [url]; const corsOptions = { origin: function(origin, callback) { console.log(origin); // 允许无Origin头的请求,同时校验白名单内的合法来源 if (!origin || dominiosPermitidos.indexOf(origin) !== -1) { callback(null, true); } else { callback(new Error('No permitido por Cors')) } } } app.use(cors(corsOptions));
备选方案:给C#请求手动添加Origin头
若不想修改API配置,可在C#代码中手动添加Origin头,值设为白名单内的URL:
url = "127.0.0.1/api/datos"; HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create(url); // 替换为你的白名单URL myWebRequest.Headers.Add("Origin", "https://你的白名单域名或IP"); HttpWebResponse myHttpWebResponse = (HttpWebResponse)myWebRequest.GetResponse(); Stream myStream = myHttpWebResponse.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myStream); string Datos = HttpUtility.HtmlDecode(myStreamReader.ReadToEnd()); dynamic data = JsonConvert.DeserializeObject(Datos); return data;
不建议直接关闭CORS
关闭CORS会使API暴露给任意来源的请求,存在安全风险。除非是完全公开的内部测试接口,否则优先采用上述两种方案解决问题。
内容的提问来源于stack exchange,提问作者Sergio Rex
相关产品推荐
相关产品推荐

