【问题标题】:Uri.UnescapeDataString fails on different computerUri.UnescapeDataString 在不同的计算机上失败
【发布时间】:2013-03-05 23:20:30
【问题描述】:

在我的开发计算机上一切正常,但当我在另一台 Windows7 计算机上测试程序时,我得到了一个 System.UriFormatException无效的 URI:字符串中的序列无效。 关于以下代码:Uri.UnescapeDataString(section);

起初我以为第二台计算机从开发电脑接收到不同的数据,所以我将失败的 html 字符串复制到一个文件并将我的代码简化为:

static void Err(string s){/*Picked up by external logging*/}

private static void GetValue()
{
    try
    {
        var html = File.ReadAllText("ld.txt");

        //Retrieve section we want
        var section = Regex.Match(
            html,
            "etc_etc(.*): ",
            RegexOptions.Singleline)
                                .Groups[1].ToString();

        Uri.UnescapeDataString(section);
    }
    catch (Exception ex)
    {
        Err(ex.ToString());
    }
}

在开发电脑上工作正常,但第二台电脑再次收到异常。他们都从完全相同的ld.txt 文件加载完全相同的html,然后用它做完全相同的事情.. 两台PC 都是x64 Win7。什么给了?

【问题讨论】:

  • .NET 版本和补丁?有可能一个已修补而另一个未修补... ld.txt 中产生错误的行是什么?
  • 没有检查,但应用程序是用 4.0 构建的。我会看看更新是否有帮助(如果有的话。)
  • 会不会是文本编码问题?一台计算机的默认文本编码与另一台计算机不同?您是否验证了计算机 1 上的字符串 section 与计算机 2 上的 section 完全相同?两者都运行相同版本的 .NET?
  • @JimMischel 根据 notepad++ 比较插件,该部分与两台 PC 匹配。
  • 如果是应用程序中的文本编码问题,使用 notepad++ 可能无法识别问题。您最好用自己的两只眼睛检查字符串。

标签: c# regex parsing uri


【解决方案1】:

UnescapeDataString 似乎在 CLR 4.0 和 4.5 之间发生了变化

我可以在两台安装了不同版本的 .Net 的机器上重现这一点(即使编译为目标 .Net 4.0)。

您的开发机器上是否有 VS 2012(因此是 .Net 4.5)而另一台计算机上只有 .Net 4?

此代码在 .Net 4.0 上引发异常,在 .Net 4.5 上传递

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("CLR version: " + Environment.Version);
        Console.WriteLine(Uri.UnescapeDataString("%"));
    }
}

【讨论】:

  • 感谢您在事后这么久的回答。我确实在我的开发机器上而不是在另一台计算机上安装了 vs2012,所以我将继续假设这是导致它的原因。
  • 不客气。我遇到了同样的问题,所以为了更大的利益把这个贴在这里:)
  • 这很有帮助。事实上,我只需要安装.Net Framework 4.5.1 Developer Pack,这个问题就解决了。包括配置、双重转义等在内的一切都相似,但这个问题并没有发生。你的解决方案做到了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2015-05-09
  • 2021-11-05
相关资源
最近更新 更多