我尝试编写基于ASP.NET Core 3的简单Web Api。但是我对CORS策略有疑问。那是我的启动类:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddCors();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseCors(
options => options.WithOrigins("http://myorigin.com").AllowAnyMethod().AllowAnyHeader()
);
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
这就是我从前端调用它的方式:
function api_call()
{
var form = document.forms["userForm"];
$.ajax({
type: "GET",
url: "http://myorigin.com:8080/access",
contentType: "application/json",
crossDomain:true,
success: function (worker) {
form.elements["result"].value = worker;
},
error: function (jxqr, error, status) {
console.log(jxqr);
if(jxqr.responseText===""){
form.elements["result"].value = jxqr.statusText;
}
else{
var response = JSON.parse(jxqr.responseText);
console.log(response);
if (response['Auth']) {
$.each(response['Auth'], function (index, item) {
form.elements["result"].value = item;
});
}
}
},
});
}
但是此函数无法访问API。它返回消息,请求被CORS策略阻止:
对预检请求的响应未通过访问控制检查:所请求的资源上没有'Access-Control-Allow-Origin'标头。
在不同的文章中,我尝试以不同的方式使用CORS。我也尝试添加手动CORS中间件,但结果相同。 我的Web Api托管在Ubuntu上,并通过kestrel服务正常运行。同样,当我在Visual Studio中本地运行它并在JS函数路径中写入本地主机(URL:“ http://localhost:56597/access”)时,它会调用API并成功获得响应。
我的错误是什么?我的前端和Web Api位于同一主机上,但是侦听不同的端口。
答案 0 :(得分:0)
我发现了自己的错误。我忘了在我的Configure方法中添加它:
app.UseAuthentication();
我读过一篇文章,这是我需要的。 在我的Web Api的Apache配置中也有错误。我有这样的参数:
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
但是它们应该是这样的:
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
现在我的Web Api正在运行,并且CORS没问题。