通过 Web.config 与 WebApiConfig 和控制器属性启用 CORS

Enabling CORS through Web.config vs WebApiConfig and Controller attributes

似乎有两种功能不同的方法可以在 Web 中启用跨域请求共享 API 2.

一个是导入System.Web.Http.CorsEnableCors属性装饰一个controller,然后在WebApiConfig中写入config.EnableCors()

[EnableCors(origins: "http://111.111.111.111", headers: "*", methods: "*")]
public class GenericController : ApiController
{
    // etc.

另一种是修改Web.config:

<system.webServer>
     <httpProtocol>
         <customHeaders>
            <add name="Access-Control-Allow-Origin" value="http://111.111.111.111" />
            <add name="Access-Control-Allow-Methods" value="*" />
            <add name="Access-Control-Allow-Headers" value="*" />

这两种不同的方法在功能上有区别吗?哪一个是正确的 - 这些不是完成同样的事情吗?如果这两种方法都启用CORS,会不会炸毁?

如果您将 header 添加到 web.config,该应用程序提供的每个 请求都将包含指定的 header秒。此方法在 Web 服务器级别受支持,并且不依赖于 config.EnableCors() 的执行。您可以使用该方法添加您想要的任何 HTTP header。

另一方面,EnableCors 属性需要 WebAPI,您需要添加一些代码才能使其工作。对于最终用户来说,结果是一样的。

至于哪种方式更好?我喜欢通过使用属性将这些设置保留在应用程序代码中,这样这些设置对未来的开发人员来说是显而易见的。根据您的需要,您可能想要研究一个抽象 CorsApiController,您的主要 ApiControllers 可以继承它以一遍又一遍地提供相同的 CORS header。但是,如果 CORS headers 需要因控制器或操作而异,则此方法将不起作用。