在配置文件的自定义配置部分中,我希望有属性或元素为服务端点定义新方案,主机和端口,但不定义路径。
因此,应允许这些https://newhost/
或http://newhost:800
,而不是newhost:800
,http://newhost/path/to/service
。
实施的最佳选择是什么?
感觉Uri.Parse,UriParser应该有一个很好的超载,这将使它变得容易。我错过了一个UriValidator吗?或者正则表达式是最好的选择(以便它可以轻易地禁止该路径)?
请注意,这不是特定于ConfigurationValidator的,因为可以重用的通用验证器很有用。
答案 0 :(得分:2)
GetLeftPart
类的Uri
方法始终可以提供帮助。
GetLeftPart方法从UriPartial系统枚举中获取枚举,其中一个(UriPartial.Authority
)将返回:
计划和权威部分 URI。
这有效地删除了原始字符串中可能存在的任何无关路径信息,如果提供的Uri不包含有效scheme(即http或https等部分),通常会返回零长度字符串Uri)和/或权威(即在你的例子中,这是Uri的newhost
部分。)
从这里开始,你应该能够将GetLLeftPart
的调用的返回值与原始的Uri字符串进行比较,如果它们不同,则Uri是“无效的”。如果它们是相同的,则Uri是“有效的”(为了您的目的)。
这是一个简单的示例类,它将执行此“验证”,为Uri返回True或False(C#和VB.NET版本):
<强> C#强>
public static class UriValidator
{
public static bool IsUriValid(string uri)
{
try
{
string original_uri = uri;
if (uri.Substring(uri.Length - 1, 1) == "/")
{
original_uri = uri.Substring(0, uri.Length - 1);
}
Uri myUri = new Uri(original_uri);
string new_uri = myUri.GetLeftPart(UriPartial.Authority);
if (original_uri.ToLower() == new_uri.ToLower())
{
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}
}
<强> VB.NET 强>
Public Class UriValidator
Public Shared Function IsUriValid(ByVal uri As String) As Boolean
Try
Dim original_uri = uri
If uri.Substring(uri.Length - 1, 1) = "/" Then
original_uri = uri.Substring(0, uri.Length - 1)
End If
Dim myUri As Uri = New Uri(original_uri)
Dim new_uri As String = myUri.GetLeftPart(UriPartial.Authority)
If original_uri.ToLower = new_uri.ToLower Then
Return True
Else
Return False
End If
Catch ex As Exception
Return False
End Try
End Function
End Class
我使用这个类进行了一个简单的测试:
Console.WriteLine("https://newhost/" + " " + UriValidator.IsUriValid("https://newhost/"));
Console.WriteLine("http://newhost:800" + " " + UriValidator.IsUriValid("http://newhost:800"));
Console.WriteLine("newhost:800" + " " + UriValidator.IsUriValid("newhost:800"));
Console.WriteLine("newhost:" + " " + UriValidator.IsUriValid("newhost:"));
Console.WriteLine("qwerty:newhost" + " " + UriValidator.IsUriValid("qwerty:newhost"));
Console.WriteLine("qwerty://newhost" + " " + UriValidator.IsUriValid("qwerty://newhost"));
Console.WriteLine("qwerty://newhost:800" + " " + UriValidator.IsUriValid("qwerty://newhost:800"));
Console.WriteLine("http://newhost/path/to/service" + " " + UriValidator.IsUriValid("http://newhost/path/to/service"));
它提供了以下输出:
https://newhost/是的 http://newhost:800真的 newhost:800错误
newhost:假的 qwerty:newhost False
qwerty:// newhost True
qwerty:// newhost:800 True
http://newhost/path/to/service错误
这似乎是你所追求的!
请注意,像qwerty://newhost
这样的Uri仍然验证为True
,因为qwerty 可能是您系统上注册的有效协议。如果您只想允许http
和/或https
,则添加此内容应该是微不足道的。