使用.Net

时间:2018-10-17 02:42:16

标签: c# asp.net .net-core uri

客观

给出输入字符串n,则返回该字符串是否为包含方案的Uri。本质上,我们提示用户提供一个字符串,并想确定它是否有一个方案。

我尝试过的事情

我从Uri.TryCreatedocumentation here)开始,期望这会给我带来方案(然后返回适当的布尔值)。而且大多数情况下都是这样。当Uri.TryCreate输出有效的Uri时,有一个.Scheme属性通常会返回该方案。

Input                         Returns
-----------------------------------------------
"http://www.test.com"   -->   "http"

为什么不起作用(我想要的方式) 尽管使用Uri的definition可能是完全正确的,但它“错误地”将没有方案的字符串标识为具有字符串的方案。示例:

Input                         Returns
-----------------------------------------------
"localhost:80"          -->   "localhost"

问题(如我所见)是,这不是一个可解决的问题。我们不知道此字符串是否表示名为localhost的方案,或者该字符串是否未指定方案但使用的是:(通常用于指定端口)。

但是,对于我来说,以我的示例为例,用户似乎更倾向于使用不使用localhost的方案来访问网站或localhost上的内容。

另一个SO答案建议使用UriBuilder,但它遇到的问题与我遇到的问题相同。

是否有更好的方法来处理?假设:后跟数字,直到字符串的末尾或正斜杠表示端口号,并从字符串中删除该部分,是否更有意义? (例如,但我确定这不是很好)

var portRegEx = new Regex("^(.*)(:[0-9]+)/*(.*)");
var match = portRegEx.Match(url);
if (match.Success)
{
    if (match.Groups.Count == 4)
        url = match.Groups[1].Value + match.Groups[3].Value;
}

或者,我可以检查已知方案的特定类型。但这对于任何非标准方案都将失败。感觉应该有比这更好的方法。

我该怎么做呢?

样品

class Program
{
    static void Main(string[] args)
    {
        PrintScheme("localhost:8000");
        PrintScheme("localhost");
        PrintScheme("http://test.com");
        Console.Read();
    }

    static void PrintScheme(string uri)
    {
        Uri.TryCreate(uri, UriKind.Absolute, out var inputUri);            
        Console.WriteLine($"Input: {uri,-15}  --> {inputUri?.Scheme ?? "No Scheme"}");
    }
}

示例输出

Input: localhost:8000   --> localhost 
Input: localhost        --> No Scheme 
Input: http://test.com  --> http

0 个答案:

没有答案