簡體   English   中英

ASP.NET 核心 3.1 MVC 路由問題與 IIS 默認 Web 站點

[英]ASP.NET Core 3.1 MVC Routing issue with IIS Default Web Site

新的信息:

在嘗試操縱 URL 后,我幾乎讓它工作了,但並不完全。 然后我發現如果我的主頁 url 是 \localhost\ABIAdmin\Home,它無需任何編碼更改即可工作。 但它以 \localhost\ABIAdmin 開頭,我的 _Layout 中有鏈接可將我帶到那里,它也以 \localhost\ABIAdmin 的形式出現(沒有 \Home)。 要求我們的用戶提供包含 home 的完整 url 很容易,但我需要鏈接來提供 \Home。 這是 Home 鏈接的 html:

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

所以現在的問題是我如何從鏈接中獲得 url 中的 \Home ,如果可能的話在啟動時? 這可以通過 IIS 或通過我的端點解決嗎?


I have an ASP.NET Core 3.1 MVC application with Razor Pages which works fine when I deploy it to IIS if I do not use the Default Web Site, or if I run the application as an exe. 我所有的導航都有效,我所有的 CRUD 操作都有效(我使用的是 Syncfusion 的 DataGrid)。 但是,如果我部署到默認 Web 站點,我會遇到路由問題。 請注意以下事項:

我在 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 個控制器,不包括隱私和家庭控制器。 任何控制器中都沒有路由信息。

我嘗試過添加虛擬目錄,但這沒有幫助。

When I navigate to the Campaigns page from the Privacy page it forms a proper URL, eg, http://localhost:5000/ABIAdmin/Campaigns, where ABIAdmin is the name of the site under the Default Web Site. 但是,如果我從主頁導航,我會收到 404 錯誤。 The requested URL is formed as http://localhost:5000/Campaigns, but it is missing the "/ABIAdmin", and the physical path is wrong too: C:\inetpub\wwwroot\Campaigns. 當我從隱私頁面成功導航時,會檢索數據,但如果我嘗試執行添加/更新/刪除操作,它就會掛起。 我相信這是因為無論網格形成的 URL 是錯誤的。 我不認為這是 Syncfusion 網格的錯。

所以問題是,在這種情況下,為什么默認 Web 站點與獨立 web 站點的行為不同? 我們將把它部署給多個客戶,有些人會希望它在默認 Web 站點下。

任何幫助,將不勝感激。 :)

看來我找到了答案。 我有 3 個場景需要處理,從 VS 運行,從獨立網站運行,以及從默認 Web 站點下的應用程序運行。 我想不出一種方法來告訴我的 _Layout.cshtml 它是否在默認 Web 站點下運行,所以我使用配置參數來告訴我。 我可以通過應用程序池的名稱判斷我是否從 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 的動態值。

因此,在我的營銷活動 controller 的 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM