繁体   English   中英

C#如何使用Uri相等?

[英]C# How to use Uri equal?

一些测试:

这是真的:

    [Fact]
    public void UriEqualTest()
    {
        //Act
        var uri1 = new Uri("https://www.baidu.com");
        var uri2 = new Uri("https://www.baidu.com/");

        var boolResult = uri2.Equals(uri1);

        //Assert
        Assert.Equal(uri1, uri2);
        Assert.True(boolResult);//True
    }

这是真的:

    [Fact]
    public void UriUpperEqualTest()
    {
        //Act
        var uri1 = new Uri("https://wWw.bAidu.com");
        var uri2 = new Uri("https://www.baidu.com/");

        var boolResult = uri2.Equals(uri1);

        var operatorResult = (uri1 == uri2);

        //Assert
        Assert.Equal(uri1, uri2);
        Assert.True(boolResult);//True
    }

这是错误的:

    [Fact]
    public void UrlEqualTest()
    {
        //Act
        var uri1 = new Uri("https://www.baidu.com/aaaa/bbbb");
        var uri2 = new Uri("https://www.baidu.com/aaaa/bbbb/");

        var boolResult = uri2.Equals(uri1);

        //Assert
        Assert.Equal(uri1, uri2);
        Assert.True(boolResult);//False
    }

这是错误的:

    [Fact]
    public void UrlUpperEqualTest()
    {
        //Act
        var uri1 = new Uri("https://www.baidu.com/AAaa/bbbb");
        var uri2 = new Uri("https://www.baidu.com/aAAa/bbbb");

        var boolResult = uri2.Equals(uri1);
        var operatorResult = (uri1 == uri2);
        //Assert
        Assert.Equal(uri1, uri2);
        Assert.True(boolResult);//False
    }

这是真的:

    [Fact]
    public void UriUpperEqualAndPathTest()
    {
        //Act
        var uri1 = new Uri("https://www.baiDu.com/aaaa/bbbb");
        var uri2 = new Uri("https://www.Baidu.com/aaaa/bbbb");

        var boolResult = uri2.Equals(uri1);

        //Assert
        Assert.Equal(uri1, uri2);
        Assert.True(boolResult);//True
    }

那么,主机不区分大小写? 但路径区分大小写?

而且我希望所有Uri dot都不区分大小写并且不是'/',我该怎么办?

而且我希望所有Uri dot都不区分大小写并且不是'/',我该怎么办?

而且我希望所有Uri dot都不区分大小写并且不是'/',我该怎么办?

在aspnet核心mvc中,如果我使用路由

[HttpGet("/private/head")] and [HttpGet("/private/HeAd")] and [HttpGet("/private/head/")]

这是错误的! 错误是: AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied: AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:

https://stackoverflow.com/a/2581418/34092说明:

就协议而言, http://example.com/somethinghttp://example.com/something/完全不同。 如果以这种方式实现,某些服务器可能会将您从一个重定向到另一个服务器。

至于纯域名,它总是发送以斜杠结尾的请求。 (域名本身不包含在HTTP请求的路径部分中,就像Greg Hewgill和其他人写的那样。但是,它包含在标题中。)

那么,看看你的例子:

    var uri1 = new Uri("https://www.baidu.com");
    var uri2 = new Uri("https://www.baidu.com/");

它们是相同的,因为always sends a request ending with a slash 因此它们是等价的。

https://serverfault.com/a/261344指出:

从DNS解析的名称不区分大小写。 这对于防止混淆很重要。

    var uri1 = new Uri("https://wWw.bAidu.com");
    var uri2 = new Uri("https://www.baidu.com/");

因此,两者是等价的(因为它们仅在情况和主机之后的斜线之间不同)。

    var uri1 = new Uri("https://www.baidu.com/aaaa/bbbb");
    var uri2 = new Uri("https://www.baidu.com/aaaa/bbbb/");

好吧,这似乎是第一种情况,但事实并非如此。 第一个场景将它们视为等效的,因为它是“纯域名”(即直接在主机之后)。 这是不同的(即斜杠在最后,而不是在主机之后),因此它们不等同(在所有Web服务器上)。 因此不相等。

    var uri1 = new Uri("https://www.baidu.com/AAAaa/bbbb");
    var uri2 = new Uri("https://www.baidu.com/aAAa/bbbb");

路径和查询字符串区分大小写。 因此这些并不相同。 一些web服务器/编程环境(如ASP.NET MVC)可作用不区分大小写的,但是根据规范的路径和查询字符串是区分大小写(因为某些Web服务器区分大小写)。

    var uri1 = new Uri("https://www.baiDu.com/aaaa/bbbb");
    var uri2 = new Uri("https://www.Baidu.com/aaaa/bbbb");

唯一的区别是主机的情况。 因此他们是平等的。

这是错误的! 错误是:AmbiguousActionException:匹配多个动作。 以下操作匹配路由数据并满足所有约束:

这是因为ASP.NET MVC 通常不区分大小写。 在ASP.NET MVC中强制区分大小写的路由可能对您的问题的这一部分有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM