解析以下可能形式的环境变量的最佳和最简单方法是什么:host[:port]
redis
redis:6379
10.0.0.72
10.0.0.72:6379
my.domain.name
my.domain.name:6379
输入永远不会附加协议。
最终目标是解析主机和端口,以便在使用System.Net.IPEndPoint
之后创建类型为Dns.GetHostAddresses(host)[0]
的对象,具体取决于环境中是否提供了ip或主机名变量
目的是帮助各种docker容器中的dotnet核心应用程序根据其环境变量中指定的值发现彼此。
我希望能够使用dotnet核心库中已有的解析实用程序,而不是使用我自己的解析器。
new Uri("redis:6379")
会产生无效结果。
new Uri("https://redis:6379")
生成一个具有正确主机和端口属性的Uri对象,但对我来说似乎有必要通过预先添加" https://"来排除所有输入的错误。只是为了让Uri对象正确解析它。
new Uri("https://redis")
错误地将Port
属性设置为443,并且没有表明它未在用户输入中提供。
如果可以跳过解析步骤并直接解析到没有中间步骤的IPEndPoint,那么这将是我的首选答案。
这是我目前正在使用的,删除了错误处理。你有更好的东西吗?
IPEndPoint ParseGateway(string input) {
var parts = input.Split(':');
var host = parts[0];
var port = parts.Length > 1 ? int.Parse(parts[1]) : DEFAULT_GATEWAY_PORT;
var ip = Dns.GetHostAddresses(host)[0];
return new IPEndPoint(ip, port);
}
答案 0 :(得分:0)
使用字符串方法SubString,如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] inputs = {
"redis",
"redis:6379",
"10.0.0.72",
"10.0.0.72:6379",
"my.domain.name",
"my.domain.name:6379"
};
string address = "";
string port = "";
foreach (string input in inputs)
{
if (input.Contains(":"))
{
address = input.Substring(0, input.IndexOf(":"));
port = input.Substring(input.IndexOf(":") + 1);
}
else
{
address = input;
port = "";
}
Console.WriteLine("Address : '{0}'; Port : '{1}'", address, port);
}
Console.ReadLine();
}
}
}