Asp Core UsePathBase:如何处理AJAX调用?

时间:2018-01-08 12:30:08

标签: asp.net-core middleware

我想在同一个VPS上托管我的ASP Core网站的两个版本,每个提供的环境一个(Staging and Test)。我希望这两个网站都可以从同一网址的子文件夹中访问:

经过阅读后,我发现了以下Github问题:https://github.com/aspnet/Hosting/issues/815

这个技巧用于AJAX调用崩溃:事实上,JavaScript调用并不知道这个新路径(BUG?)。所有请求都将发送到根基路径(忽略/Staging/Test)。

我部分解决了它使用中间件将我的AJAX调用重定向到正确的路径。它适用于GET请求,但对于有主体的POST请求显然会失败。

请注意,如果我们不重定向,只是更改中间件中的原始PathBase请求,如果API调用需要任何身份验证架构,则会抛出401错误:原始PathBase是根{{1如果响应具有不同的路径库,即/,则标头中的cookie会阻止此交叉路径基本请求/响应。

有人能告诉我实现我的需求是什么样的练习?

Startup.cs

/Staging

我的中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env
{
    app.UsePathBase($"/{env.EnvironmentName}");
    ...
}

1 个答案:

答案 0 :(得分:1)

当然,您的客户端代码将无法根据当前请求的活动路径库自动更改其代码。 JavaScript代码(通常)是静态内容,因此,除非您实际动态地重写代码,否则无法更新嵌入其中的URL。

您可以从当前请求的URL确定基本路径,但这是一个相当脆弱的解决方案,因为您需要找到一个无论您在应用程序中的哪个位置都能工作的逻辑。所以不建议这样做。

总体问题是在客户端,没有路径库(甚至是环境)的概念。因此,您必须将该知识从服务器传输到客户端。就像使用路径基础中间件为服务器端代码设置路径库一样,您将需要一些服务器端代码将路径库传递给客户端代码。

我个人所做的只是在应用程序布局中配置API的根路径。所以我的_Layout.cshtml包含以下行:

<body data-api="@Url.Content("~/api/")">

这样,我就可以使用JavaScript中的document.body.dataset.api检索API的根路径。然后我的所有AJAX调用都被制作出来以便他们尊重这个价值。这样,我可以在任何路径上托管该站点,并且AJAX调用也将使用正确的路径。

您也可以使用"~"作为内容路径来引用应用程序的根目录。如果您愿意,也可以在<script>块内的JavaScript变量中公开此值。