我正在使用带有Asp核心web api的Angular 4应用程序,我在locahost上测试了不同的端口。我的WebApi需要Windows身份验证(需要获取登录用户名)。所有使用GET的调用工作,但不幸的是,我无法让POST工作。我有CORS的WebApi设置:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddDbContext<CatalogContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddCors(options =>
{
options.AddPolicy("AllowAll", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
services.AddMvc();
}
而angular 4客户端正试图发布文件
fileChange(event) {
let fileList: FileList = event.target.files;
if (fileList.length > 0) {
let file: File = fileList[0];
let formData: FormData = new FormData();
formData.append('uploadFile', file, file.name);
let headers = new Headers();
/** No need to include Content-Type in Angular 4 */
headers.append('Content-Type', 'multipart/form-data');
headers.append('Accept', 'application/json');
let options = new RequestOptions({ headers: headers, withCredentials: true });
this.http.post("http://localhost:495/api//upload",formData, options)
.map(res => res.json())
.catch(error => Observable.throw(error))
.subscribe(
data => console.log('success'),
error => console.log(error)
)
}
我的错误:
XMLHttpRequest无法加载http://localhost:495/api//upload。 No&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。起源&#39; http://localhost:4200&#39;因此不允许访问。响应的HTTP状态代码为500。
和响应标题
的Content-Length:0 日期:太阳,2017年8月13日13:13:09 GMT 持久验证:真 服务器:红隼 X-已启动方式:ASP.NET X-SourceFiles:????= UTF-8乙QzpcU291cmNlIENvZGVcUGFydG5lcnNoaXBDYXRhbG9nXFBhcnRuZXJzaGlwQ2F0YWxvZ1xQYXJ0bmVyc2hpcENhdGFsb2cuV2ViQXBpXGFwaVx1cGxvYWQ = =
任何帮助将不胜感激!
答案 0 :(得分:2)
你需要这样的东西:
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder =>
builder.AllowAnyOrigin()
.AllowAnyMethod()
.WithExposedHeaders("content-disposition")
.AllowAnyHeader()
.AllowCredentials()
.SetPreflightMaxAge(TimeSpan.FromSeconds(3600)));
});
注意AllowCredentials()
。
您还需要使用Startup
文件Configure
方法:
app.UseCors("CorsPolicy");
答案 1 :(得分:2)
预检请求(OPTIONS)不会向服务器发送身份验证信息。因此,除了WinAuth之外,还需要启用Anonymous Auth。请参阅:https://stackoverflow.com/a/50354772/946773