如何在 IIS 托管的 C# web 服务中强制访问控制允许来源

Posted

技术标签:

【中文标题】如何在 IIS 托管的 C# web 服务中强制访问控制允许来源【英文标题】:How to force Access-Control-Allow-Origin in an IIS hosted C# webservice 【发布时间】:2019-09-05 18:01:10 【问题描述】:

我在 IIS 10 中托管了一个 .net 网络服务。我正在尝试从 Angular 前端的网络服务器获取数据。

我在 IIS 中启用了 Access-Control-Allow-Origin:

我还在我的 Web.Conf 中启用了 customHeaders:

当我尝试从有角度的前端访问 web 服务时,我收到此错误:

我正在使用来自 @angular/common/http 的 HttpClient 并尝试了几种不同的请求,但仍然没有运气。这是我最近一次失败的请求

public GetSlippage(tradeGroup: string, start: string, end: string, period: string, premiumFilter: number): Observable<SlippageContainer> 
    let url: string = `$this._slippageUrl/$tradeGroup`;
    let queryParams: HttpParams = new HttpParams()
    .set('start', start)
    .set('end', end)
    .set('period', 'none')
    .set('premium', String(premiumFilter));

    let heads: HttpHeaders = new HttpHeaders();
    heads = heads.append('Content-Type', 'text/plain');
    heads = heads.append('Access-Control-Allow-Origin', '*');

    console.log(`Sent Slippage Request $start $end`);
    return this._httpClient.get<SlippageContainer>(url,  headers: heads, params: queryParams );

由于某种原因,当我使用 http://&lt;serverName&gt;:port/endpoint 时请求会起作用 但不是http://&lt;serverName.domainName.local:port/endpoint。最终,我希望能够在 url 中使用完全限定的域名。

【问题讨论】:

那些是响应头。 @DanielA.White 你能澄清一下吗?我已经在 IIS 的方法和 web.conf 的 Allow-Methods 中列出了 GET。 【参考方案1】:

您需要在您的 asp.net 应用程序中允许 CORS。 在 ConfigureServices 中添加:

services.AddCors(o => o.AddPolicy("AllowAll", builder =>

    builder.AllowAnyOrigin()
           .AllowAnyMethod()
           .AllowAnyHeader();
));

并在配置中添加:

app.UseCors("AllowAll");

您可以通过指定方法、标头和来源来制定更严格的策略。

【讨论】:

以上是关于如何在 IIS 托管的 C# web 服务中强制访问控制允许来源的主要内容,如果未能解决你的问题,请参考以下文章

如何强制更新/防止在 Linux 上运行并由 nginx 反向代理服务器托管的 .NET Core Web 应用程序的 HTML 缓存

如何从服务“内部”的代码访问托管在 IIS 中的 WCF 服务的 web.config

如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?

想要将 WCF Web 服务作为 Windows 服务托管,而不是在 IIS 中托管

无法在 IIS 中托管 Web 服务

在 IIS 中托管时如何从代码配置 WCF 服务?