【问题标题】:How to convert string to IPAddress如何将字符串转换为 IP 地址
【发布时间】:2021-10-15 11:20:08
【问题描述】:

我试图将 tempdata 与 ip 地址一起使用,当我尝试将 tempdata 分配给 ipaddress 变量时,它说我需要对其进行序列化,所以我在网上看到了如何序列化 ip 地址变量。在实现它之后,我在中间件中遇到了一个问题,我在其中创建了一个变量IPAddress ipAddress,并在我的 tempdata.containskey() 的 if 语句中将其分配为 `ipAddress = (IPAddress)tempdata.Peek("ipaddress")。 ToString();但是在调试时我看到它给了我一个异常说:

System.InvalidCastException:无法将“System.String”类型的对象转换为“System.Net.IPAddress”类型

然后我将 IPAddress ipAddress 更改为 string ipAddress,现在当它在 tempdata 的 if 语句中遇到 ipAddressipAddress 将保持 "\"::1\"" .现在是因为我正在调试它而用两个“\”'显示它吗?它真的拥有“::1”的价值吗?只是想确保我没有让 ipAddress 使用两个 \'s 来保存这样的值。

Middleware:

    public class CorrelationIdMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger _logger;
        private readonly ITempDataDictionaryFactory _tempDataDictionaryFactory;
        public CorrelationIdMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, ITempDataDictionaryFactory tempDataDictionaryFactory)
        {
            _next = next;
            _logger = loggerFactory.CreateLogger<CorrelationIdMiddleware>();
            _tempDataDictionaryFactory = tempDataDictionaryFactory;
        }

        public async Task Invoke(HttpContext context)
        {
            string correlationId = null;
            string userName;
            string ipAddress;

            var tempData = _tempDataDictionaryFactory.GetTempData(context);

            var key = context.Request.Headers.Keys.FirstOrDefault(n => n.ToLower().Equals("x-correlation-id"));
            if (!string.IsNullOrWhiteSpace(key))
            {
                correlationId = context.Request.Headers[key];
                _logger.LogInformation("Header contained CorrelationId: {@CorrelationId}", correlationId);
            }
            else
            {
                if (tempData.ContainsKey("username") && tempData.ContainsKey("ipaddress"))
                {
                    userName = tempData.Peek("username").ToString();
                
                    ipAddress = tempData.Peek("ipaddress").ToString();

                    context.Response.Headers.Append("X-username", userName);
                    context.Response.Headers.Append("X-ipAddress", ipAddress);
                }

                correlationId = Guid.NewGuid().ToString();
                _logger.LogInformation("Generated new CorrelationId: {@CorrelationId}", correlationId);
            }
            context.Response.Headers.Append("x-correlation-id", correlationId);
            using (LogContext.PushProperty("CorrelationId", correlationId))
            {
                await _next.Invoke(context);
            }
        }
    }

【问题讨论】:

    标签: c# html asp.net-core-mvc ip-address tempdata


    【解决方案1】:

    如果这是您在调试器中看到的内容*,那么您的变量确实包含那些 ",我会说是在 json 转换器中序列化为字符串的结果; Json 属性和值总是用引号括起来。如果你想要一个 IPAddress 作为一个字符串,它有一个被覆盖的ToString method...

    • 如果您在调试工具提示中看到的内容带有斜线等,请单击? 打开文本可视化器;你看到的是真正准确的字符串内容(如果你将字符串写入文件并在记事本中打开它会看到什么)

    【讨论】:

    • 感谢您的解释!因此,如果我想将该变量作为字符串,我只需要将 string ipAddress 替换为 IPAddress 然后调用 .ToString 方法?当我点击放大镜时,它完全像这样“::1”
    • 该变量无论如何都是一个字符串,它只是通过使用在开头和结尾添加引号的 json 序列化程序从 IPAddress 转换为字符串。如果你只是在你的家庭控制器中使用TempData["ipaddress"] = JsonConvert.SerializeObject(userip, settings); 并制作它TempData["ipaddress"] = userip.ToString(); 你会得到它没有引号
    • 有道理!我很感激!谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2017-08-25
    • 2019-05-13
    • 2022-01-13
    相关资源
    最近更新 更多