gpt4 book ai didi

asp.net-mvc-5 - Web API 和 MVC 5 Controller 上的 CORS : Upload images with fetch and FormData

转载 作者:行者123 更新时间:2023-12-02 20:51:34 26 4
gpt4 key购买 nike

我有一个应用程序,其前端和后端运行在不同的 .NET 项目上。前端是 Aurelia在 ASP.NET 5 上运行的 Web 应用程序。此 Aurelia 应用程序(从现在开始前端)从 Web API 2/MVC 5 应用程序(从现在开始后端)获取所有数据>).

由于前端和后端是不同的应用程序,我在 Web API 和 Start.Auth.cs 中为 token 持有者请求设置了 CORS。

前端正在 http://localhost:49850 上运行。

现在,对于一些代码(这全部在后端)

开始.Auth.cs

整个应用程序驻留在登录表单后面,因此位于 Start.Auth.cs 文件内,而不是在静态启动上设置基于 token 的身份验证( ),方法我有一些中间件,可以在还没有可用 token 的情况下将 Access-Control-Allow-Origin header 添加到请求中:当我们请求时一个。

public void ConfigureAuth(IAppBuilder app)
{
app.Use(async (context, next) =>
{
if (context.Request.Path.Value.Equals("/token"))
context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost:49850" });
await next();
});

app.UseCors(CorsOptions.AllowAll);
app.UseOAuthAuthorizationServer(OAuthOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}

WebApiConfig.cs

这里我刚刚添加了EnableCorsAttribute,以便全局启用它。

var enableCors = new EnableCorsAttribute("http://localhost:49850", "*", "*");
config.EnableCors(enableCors);

上传文件

一切正常;我可以毫无问题地向 Web API 执行 GETPOST 请求,但在尝试上传图像时出现问题。

为了上传到文件,我在 ASP.NET MVC Controller 中有一个名为 FileControler 的操作方法。

文件 Controller .cs

[HttpPost]
public ActionResult UploadImage(string id, string name = "")
{
var files = (from string fileName in Request.File
select Request.Files[fileName]
into file
where file != null
select DoSomethingWithTheFile(file, id)).ToList();
// ...

return Json(arrayWithFileUrls);
}

调用MVC Controller

这已经是前端的一部分。

要调用此方法,我使用 Aurelia's Fetch Client :

upload(url, data, files) {
let formData = new FormData();
for (let key of Object.keys(data)) {
formData.append(key, data[key]);
}
for (let i = 0; i < files.length; i++) {
formData.append(`files[${i}]`, files[i]);
}

return this.http.fetch(url, {
method: "POST",
body: formData,
headers: {
cmsDatabase: sessionStorage["cmsDatabase"]
}
}).then(response => {
return response.json();
}).catch(error => {
console.log(error);
});
}

这是对上面的 upload 方法的调用:

// files comes from an <input type="file" />
upload("http://localhost:64441/file/uploadImage", { id: id }, files)
.then((uploadedPhotos) => {
// do something with those file urls...
});

问题

如果我从 WebApiConfig.cs 中删除所有 CORS 设置,并且在 Startup.Auth.cs 中我将对中间件的调用替换为 app,则所有这些都有效.UseCors(CorsOptions.AllowAll);,所以我知道我的代码没问题,但是一旦我使用上述 CORS 设置,除了调用 http://localhost:64441/之外,一切正常file/uploadImage,甚至返回 404:

Fetch API cannot load http://localhost:64441/file/uploadForSku. 
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin'
header is present on the requested resource.
Origin 'http://localhost:49850' is therefore not allowed access.
The response had HTTP status code 404. If an opaque response serves your needs,
set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

“有趣”的事情是,如果我尝试使用例如 REST Console 调用该网址我没有收到 404。

我尝试将 [HttpOptions] 属性添加到操作方法中;我已尝试按照描述创建 ActionFilterAttributes herehere ,甚至在 web.config 中设置 uip CORS,但没有效果。

我知道问题是 FileController 是一个常规的 MVC Controller 而不是 Web API Controller ,但是是否仍然可以让 CORS 工作?

最佳答案

你试过这个吗

 context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

在ApplicationOAuthProvider.cs文件中

关于asp.net-mvc-5 - Web API 和 MVC 5 Controller 上的 CORS : Upload images with fetch and FormData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35900594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com