Visual Studio 中带有 ASP.NET Web API 项目的 Angular 项目

Posted

技术标签:

【中文标题】Visual Studio 中带有 ASP.NET Web API 项目的 Angular 项目【英文标题】:Angular project with ASP.NET Web API project in Visual Studio 【发布时间】:2017-10-28 01:46:26 【问题描述】:

我在 Visual Studio 2017 中有两个项目的解决方案。

一个包含我用于客户端 SPA 的所有 Angular 文件。而另一个是一个 ASP.NET web api 项目,用作 Angular 前端进行的 http 调用的端点。

我正在使用 Angular CLI 和 ng-serve 将我的 Angular 应用程序部署到 localhost:4200

web api 部署到 localhost:6463

在生产环境中,它们将在同一个域下。但是,在开发中,它们不在同一个域中,因为 localhost 的端口不同。迫使我实现 CORS,因为 Angular 应用程序必须与 web api 对话。

对我来说,仅出于开发目的实施 CORS 似乎不太理想。

有更好的结构吗?或者有什么我想念的吗?

【问题讨论】:

【参考方案1】:

简单回答

否。 请参阅下面的代理部分以获取更新的答案。

您需要启用 CORS。根据Official Microsoft Documentation for ASP.NET Core,在关于跨域请求(CORS)的部分下,他们提供了“同源”的定义

什么是“同源”?

如果两个 URL 具有相同的方案、主机和端口,则它们具有相同的来源。 (RFC 6454) 这两个 URL 具有相同的来源:

http://example.com/foo.html http://example.com/bar.html

这些 URL 的来源与前两个不同:

http://example.net - 不同的域 http://www.example.com/foo.html - 不同的子域 https://example.com/foo.html - 不同的方案 http://example.com:9000/foo.html - 不同的端口 ⇦ ⇦ ⇦ ⇦ 你的问题

注意: Internet Explorer 在比较来源时不考虑端口。

如何启用 CORS

为您的案例启用 CORS 的快速方法:

Startup.cs

app.UseCors(builder => builder.WithOrigins("localhost"));

更新: 根据this tutorial 的说法,没有CORS 也可以做到。

API 代理

您需要在 Frontend 目录中创建一个名为 proxy.conf.json 的文件:


  "/api": 
    "target": "http://localhost:65498",
    "secure": false
  

目标值包含一个端口号。如果您使用的是 Visual Studio,则可以从后端项目属性中读取它。

这会将所有 API 请求传递给正在运行的 ASP.NET Core 应用程序。

这里我们需要做的最后一件事是修改 npm start 脚本,所以它使用代理配置。在Frontend项目中打开package.json,找到scripts部分,修改start命令为:

"start": "ng serve --proxy-config proxy.conf.json"

要在应用程序上工作,您需要同时启动 ng 开发服务器和 ASP.NET 应用程序。第一个是使用从 Frontend 目录执行的命令 npm start 启动的。后端应用程序可以从 Visual Studio 启动,也可以使用 dotnet watch run 命令行启动。如果您使用命令行版本,请注意它使用的端口并在代理配置文件中正确设置它。 dotnet 中的 watch 命令监视应用程序中的更改,并在您更改某些内容时重新构建它。

【讨论】:

【参考方案2】:

要在 ASP.NET Web API 2 站点中启用 CORS,您可以按照说明进行操作 here。

首先,您必须在包管理器控制台中使用以下命令添加 CORS NuGet 包:

Install-Package Microsoft.AspNet.WebApi.Cors

然后将以下行添加到您的 WebApiConfig.Register 方法中:

config.EnableCors();

然后,编辑您的 api controller 类以包含:

using System.Web.Http.Cors;

并在 controller 类声明之前添加 CORS 属性:

[EnableCors(origins: "http://localhost:4200", headers: "*", methods: "*")]

【讨论】:

【参考方案3】:

通过浏览器扩展的 Chrome 解决方案

如果您不想更改后端中的任何内容并且使用 Chrome 进行开发,则可以使用类似 Moesif Origin & CORS Changer 的扩展程序。

它允许您覆盖浏览器请求的OriginAccess-Control-Allow 标头。

下载并安装扩展程序,然后通过 Chrome 右上角的图标激活它。右键单击该图标,然后单击Options。 现在您可以根据自己的喜好修改OriginAccess-Control-Allow- 标头。

这仅限于在 localhost 上开发,完成后不要忘记停用扩展!


这是我使用 ASP.NET Core 和 Angular CLI 发出的示例请求。 Angular 开发服务器在端口 4200 上运行,后端在端口 53632 上运行。

请求不启用扩展:

启用扩展并覆盖原点:

现在Origin-Header 已更改:

【讨论】:

以上是关于Visual Studio 中带有 ASP.NET Web API 项目的 Angular 项目的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net - 从 Visual Studio 2003 过渡到 Visual Studio 2010

Visual Studio 2017 安装中断 Visual Studio 2015 ASP.NET Core 项目

ASP.NET 4 and Visual Studio 2010

为 Visual Studio 2013 启用 ASP.NET 配置

Visual Studio ASP.NET/HTML 重新格式化功能 - 它存在吗?

Visual Studio 2017 ASP.Net 发布自包含的点网核心应用