dotnet/maui

Blazor Hybrid Webview cannot be force reloaded for urls containing query parameters with a dot (.)

Open

#25,689 opened on 2024年11月5日

GitHub で見る
 (1 comment) (2 reactions) (0 assignees)C# (23,245 stars) (1,951 forks)batch import
area-blazorgood first issueplatform/androidplatform/ioss/triageds/verifiedt/bug

説明

Description

There is an issue in Blazor MAUI where URLs containing a query parameter with a dot (.) cannot be force reloaded.

The issue stems from the Path.HasExtension method, which incorrectly identifies the query parameter as a file extension. This causes the URL to be treated as a file path, leading to unexpected behavior when attempting a force reload.

Path.HasExtension is being used from [UriExtensions] in BlazorWebView (https://github.com/dotnet/maui/blob/main/src/BlazorWebView/src/Maui/Extensions/UriExtensions.cs)

Steps to Reproduce

Steps to Reproduce

  • Clone the repository
  • Open the solution
  • Run the application on iOS or Android
  • Navigate to the home page
  • Click on the link to force a refresh/reload for the current page with query parameters.
  • Observe the application navigating to a empty webpage with a "There is no content at url" message.

Link to public reproduction project repository

https://github.com/modplug/HybridMauiQueryParamsFailureRepro

Version with bug

8.0.92 SR9.2

Is this a regression from previous behavior?

Not sure, did not test other versions

Last version that worked well

Unknown/Other

Affected platforms

iOS, Android

Affected platform versions

No response

Did you find any workaround?

I haven't been able to find a way around this since the url parsing and navigation is internal in

Relevant log output

private void TestIfUrlIsBaseOfPage()
    {
        var urlWithoutQueryParameterWithDot = "https://example.com/customer?weight=62";
        var urlWithQueryParameterWithDot = "https://example.com/customer?weight=62.5";

        var isAddressWithoutDotBaseOfPage = new Uri("https://example.com").IsBaseOfPage(urlWithoutQueryParameterWithDot); // true
        var isAddressWithDotBaseOfPage = new Uri("https://example.com").IsBaseOfPage(urlWithQueryParameterWithDot); // false but expected true

        var isAddressWithoutDotAFilePath = Path.HasExtension(urlWithoutQueryParameterWithDot); // false
        var isAddressWithDotAFilePath = Path.HasExtension(urlWithQueryParameterWithDot); // true but expected false

        Console.WriteLine($"{urlWithoutQueryParameterWithDot}: {nameof(isAddressWithoutDotBaseOfPage)}: {isAddressWithoutDotBaseOfPage}");
        Console.WriteLine($"{urlWithQueryParameterWithDot}: {nameof(isAddressWithDotBaseOfPage)}: {isAddressWithDotBaseOfPage}");
        Console.WriteLine($"{urlWithoutQueryParameterWithDot}: {nameof(isAddressWithoutDotAFilePath)}: {isAddressWithoutDotAFilePath}");
        Console.WriteLine($"{urlWithQueryParameterWithDot}: {nameof(isAddressWithDotAFilePath)}: {isAddressWithDotAFilePath}");
    }

this outputs:
https://example.com/customer?weight=62: isAddressWithoutDotBaseOfPage: True
https://example.com/customer?weight=62.5: isAddressWithDotBaseOfPage: False
https://example.com/customer?weight=62: isAddressWithoutDotAFilePath: False
https://example.com/customer?weight=62.5: isAddressWithDotAFilePath: True

コントリビューターガイド