【问题标题】:ASP.NET Core 3.1 MVC Routing issue with IIS Default Web SiteIIS 默认网站的 ASP.NET Core 3.1 MVC 路由问题
【发布时间】:2021-03-10 21:39:40
【问题描述】:

新信息:

在尝试操纵 URL 后,我几乎可以正常工作,但并不完全正常。然后我发现如果我的主页 url 是 \localhost\ABIAdmin\Home,它无需任何编码更改即可工作。但它以\localhost\ABIAdmin 开头,我的_Layout 中有链接可将我带到那里,它也以\localhost\ABIAdmin 的形式出现(没有\Home)。要求我们的用户提供包含 home 的完整 url 很容易,但我需要链接来提供 \Home 。这是主页链接的 html:

 <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Dashboard</a>

所以现在的问题是我如何从链接中获取 url 中的 \Home,如果可能的话,如何在启动时获取?这可以通过 IIS 或通过我的端点解决吗?


我有一个带有 Razor Pages 的 ASP.NET Core 3.1 MVC 应用程序,如果我不使用默认网站,或者如果我将应用程序作为 exe 运行,当我将它部署到 IIS 时,它可以正常工作。我所有的导航都有效,我所有的 CRUD 操作都有效(我使用的是 Syncfusion 的 DataGrid)。但是,如果我部署到默认网站,我会遇到似乎是路由问题。请注意以下几点:

我在 c:\inetpub\wwwroot 下添加了一个名为 ABIAdmin 的文件夹,其中包含我的核心应用程序。

Startup/ConfigureServices 中的相关代码:services.AddControllersWithViews();

启动/配置中的相关代码:

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthorization();
        app.UseCookiePolicy();
        app.UseSession();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");

            endpoints.MapControllerRoute(
                name: "Privacy",
                pattern: "{controller=Privacy}/{action=Privacy}/{id?}");
        });

我有大约 80 个控制器,不包括隐私和家庭控制器。任何控制器中都没有路由信息。

我尝试过添加虚拟目录,但没有帮助。

当我从隐私页面导航到活动页面时,它会形成一个正确的 URL,例如 http://localhost:5000/ABIAdmin/Campaigns,其中 ABIAdmin 是默认网站下的站点名称。但是,如果我从主页导航,我会收到 404 错误。请求的 URL 格式为 http://localhost:5000/Campaigns,但缺少“/ABIAdmin”,物理路径也错误:C:\inetpub\wwwroot\Campaigns。当我从隐私页面成功导航时,会检索数据,但如果我尝试执行添加/更新/删除操作,它就会挂起。我相信这是因为网格形成的任何 URL 都是错误的。我不认为这是 Syncfusion 网格的错。

所以问题是,为什么在这种情况下默认网站的行为与独立网站不同?我们将把它部署给多个客户,有些客户希望在默认网站下使用它。

任何帮助将不胜感激。 :)

【问题讨论】:

  • “其中ABIAdmin是Default Web Site下的站点名称”单独表示需要阅读docs.microsoft.com/en-us/iis/get-started/…IIS上的站点下没有站点。
  • 谢谢 Lex,我用错了术语。你能说这是我的第一个网站吗? :)

标签: asp.net-mvc iis url-routing asp.net-core-3.1 syncfusion


【解决方案1】:

看来我找到了答案。我有 3 个场景需要处理,从 VS 运行、从独立网站运行以及从默认网站下的应用程序运行。我想不出一种方法来告诉我的 _Layout.cshtml 它是否在默认网站下运行,所以我使用配置参数来告诉我。我可以通过应用程序池的名称判断我是否从 VS 运行(从 VS 它是“ABIAdminApp AppPool”)。我还可以通过检查 Context.Request.Path 来判断我现在是否来自主页(那是缺少的链接)。鉴于该信息,我可以有条件地添加我的应用程序的名称 ABIAdminApp。请注意,在原始帖子中,我可能将其称为 ABIAdmin。我也会考虑将应用的名称作为配置参数。

@{
    @using ABIAdminApp.Classes;
    @using Microsoft.Extensions.Configuration;
    @inject IConfiguration Configuration;

    string appPoolId = System.Environment.GetEnvironmentVariable("APP_POOL_ID");
    string appName = "";

    if (appPoolId != "ABIAdminApp AppPool" && Context.Request.Path.ToString() == "" && Extensions.UseDefaultWebsite(Configuration)) { appName = "ABIAdminApp" + "/"; } else { appName = ""; }

string anchor_template = "<a href='" + appName + "${URL}'>${FriendlyName}</a>";

}

这样就解决了我的导航问题。我还必须对 Syncfusion 网格更新进行更改。为此,我必须有条件地添加应用程序名称并使用 ViewBag 以及 insertUrl、updateUrl 和 removeUrl 的动态值。

因此,在我的 Campaigns 控制器的 Index 方法中,我有这段代码(在逻辑之前确定是否添加应用程序名称):

   ViewBag.InsertUrl = AppName + "/Campaigns/Insert";
   ViewBag.UpdateUrl = AppName + "/Campaigns/Update";
   ViewBag.RemoveUrl = AppName + "/Campaigns/Delete";

在我看来,这段代码是 Campaigns.cshtml:

  <e-data-manager url="Campaigns/Campaigns" adaptor="UrlAdaptor" insertUrl="@ViewBag.InsertUrl" updateUrl="@ViewBag.UpdateUrl" removeUrl="@ViewBag.RemoveUrl"></e-data-manager>

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 2020-11-15
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多