如何通过代码启用对 URI 类的 IDN/IRI 支持?

2024-03-05

我正在尝试为 URI 类启用 IDN/IRI 支持,因为我需要德国变音域(例如 www.bücher.de)上的“Uri.IsWellFormedUriString”方法。

我发现类似的问题https://stackoverflow.com/a/6107682/413531 https://stackoverflow.com/a/6107682/413531(取自http://msdn.microsoft.com/en-us/library/system.uri.aspx http://msdn.microsoft.com/en-us/library/system.uri.aspx在“国际资源标识符支持”),但该解决方案对我不起作用。我当前的 app.config 文件如下所示:

<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="..." type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        <!-- ... some sections in here ... -->
        </sectionGroup>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <!-- ... some sections in here ... -->
        </sectionGroup>
    </configSections>
    <userSettings>
        <!-- ... some settings in here ... -->
    </userSettings>
    <applicationSettings>
        <!-- ... some settings in here ... -->
    </applicationSettings>
</configuration>

当我刚刚添加时

  <uri>
  <idn enabled="All" />
  <iriParsing enabled="true" />
  </uri>

作为最后的另一个子项,抛出异常: ConfigurationErrorsException - {"Das Konfigurationssystem konnte nicht initialisiert werden."}

所以我进一步阅读http://msdn.microsoft.com/en-us/library/system.uri.aspx http://msdn.microsoft.com/en-us/library/system.uri.aspx遇到了

Uri 类中的 IRI 和 IDN 处理也可以使用以下命令进行控制 System.Configuration.IriParsingElement, System.Configuration.IdnElement 和 System.Configuration.UriSection 配置设置类。这 System.Configuration.IriParsingElement 设置启用或禁用 IRI 在 Uri 类中进行处理。 System.Configuration.IdnElement 设置启用或禁用 Uri 类中的 IDN 处理。这 System.Configuration.IriParsingElement 设置也间接 控制 IDN。必须启用 IRI 处理才能进行 IDN 处理 可能的。如果禁用 IRI 处理,则 IDN 处理将被禁用 设置为 .NET Framework 2.0 行为的默认设置 用于兼容性,不使用 IDN 名称。

不幸的是,我无法找到 System.Configuration.IriParsingElement、System.Configuration.IdnElement 和 System.Configuration.UriSection 的使用示例。我不知道这些是怎么用的...

所以基本上,我的问题归结为:我想在 URI 类中启用 IDN/IRI 支持,但我不知道如何做到这一点。配置解决方案对我不起作用,所以我想通过代码尝试它,但不知道如何操作。顺便提一句。我还想知道为什么配置不起作用;)


这是我的解决方案,经过测试有效。

基本上,您需要更改 System.Uri 的静态非公共字段的值:

  • s_IdnScope
  • s_Iri解析

    public static bool ToggleIDNIRISupport(bool enable)
    {
        //Important: Try IsWellFormedUriString() once to initialize static fields: s_IdnScope, s_IriParsing
        Uri.IsWellFormedUriString("http://example.com/query=ü", UriKind.Absolute);
    
        //Get the assembly that contains the class
        Assembly assembly = Assembly.GetAssembly(typeof(Uri));
        if (assembly != null)
        {
            //Use the assembly in order to get the type of the class
            Type uriType = assembly.GetType("System.Uri");
            if (uriType != null)
            {
                object idnScope = uriType.InvokeMember("s_IdnScope", BindingFlags.Static | BindingFlags.GetField | BindingFlags.NonPublic, null, null, new object[] { });
                if (idnScope != null)
                {
                    if (enable)
                    {
                        uriType.InvokeMember("s_IdnScope", BindingFlags.Static | BindingFlags.SetField | BindingFlags.NonPublic, null, null, new object[] { UriIdnScope.All });
                    }
                    else
                    {
                        uriType.InvokeMember("s_IdnScope", BindingFlags.Static | BindingFlags.SetField | BindingFlags.NonPublic, null, null, new object[] { UriIdnScope.None });
                    }
                }
    
                object iriParsing = uriType.InvokeMember("s_IriParsing", BindingFlags.Static | BindingFlags.GetField | BindingFlags.NonPublic, null, null, new object[] { });
                if (iriParsing != null)
                {
                    uriType.InvokeMember("s_IriParsing", BindingFlags.Static | BindingFlags.SetField | BindingFlags.NonPublic, null, null, new object[] { enable });
                }
            }
        }
    
        return true;
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过代码启用对 URI 类的 IDN/IRI 支持? 的相关文章

随机推荐

  • 如何在 Xamarin Picker 控件中显示两个项目:字符串和图像?

    I have a situation where I need to display a picker control in Xamarin like the following way 它将并排显示国家国旗和国家代码 所选的国家 地区代码
  • HTML5 平铺引擎

    在哪里可以找到 HTML5 的图块引擎
  • 从“添加或删除规则集”中删除规则集

    在尝试通过 Nuget 将规则集加载和卸载到 C 中后 我的 添加或删除规则集 窗口中有一堆来自其他解决方案的规则集 我在任何地方都没有使用这些规则集 更不用说在我当前的项目中了 有没有办法从这个列表中删除项目 您应该能够通过编辑以下注册表
  • 为什么当我设置 CurrentCulture 时时区没有改变?

    根据我的研究 不可能更改线程的时区 所以我的问题是why你不能吗 我本以为将应用程序的文化切换到特定国家 地区也会改变这一点 在我看来似乎是预期的行为 Edit 修改后我可以明白为什么它可能不应该默认映射 1 1 的原因 然而 我仍然认为能
  • 如何消除 .dropdown 和 .dropdown-menu 之间的间隙

    在移动视图中时 单击 dropdown菜单之间有一个小空间 dropdown和 dropdown menu 如图所示 Question是否可以消除那个小空间 间隙 Codepen 示例代码视图 http codepen io riwakaw
  • ASP.NET MVC HTTP 发布/删除

    我有一个 ASP NET MVC 应用程序 我有单个函数模式 将通过 HTTP POST 和 HTTP DELETE 调用 尽管调用了 Post 但从未调用过删除 我确认 IIS 接受 HTTP 删除 任何意见 路线和控制器 routes
  • 如何增加 phpMyAdmin 中的导入大小限制

    有谁知道是否或如何可以增加phpMyAdmin 中的导入大小限制 目前我的服务器限制为 50MB 请注意 这与upload max filesize在 php ini 中 该值设置为 2MB 我需要将一张表导入到我的一个数据库中 而 php
  • SQL中表名前面的“#”是什么意思?

    SQL 中名为 mytable 的表和 table 有什么区别 我在很多自定义程序中看到表名以 开头 这些是本地临时表 对于创建它们的进程来说是私有的
  • 将txt文件的全文存储到mongodb中

    我创建了一个 python 脚本 可以自动执行将 PDF 转换为 txt 文件的工作流程 我希望能够在 MongoDB 中存储和查询这些文件 我需要将 txt 文件转换为 JSON BSON 吗 我应该使用像 PyMongo 这样的程序吗
  • 有什么办法可以访问本地网络中的GAE开发应用程序服务器吗?

    如果我通过以下方式访问我的网站http 本地主机 8080 http localhost 8080来自运行服务器的同一台 Win 7 PC 则它可以正常工作 如果我尝试从另一台电脑访问它 使用我的内部电脑的 IPhttp 192 168 1
  • 如果我使用 byte 而不是 int,我的循环迭代速度会更快吗?

    这段代码是否 for byte b 0 b lt 100 b some code 比这段代码运行得更快 for int b 0 b lt 100 b some code 一点都不 如果有的话 它会更慢 因为底层硬件通常具有处理本机 int
  • 如何在 Fortran 中获取未知长度的命令行参数?

    我想从用于运行程序的命令行读取一些文本字符串 我正在使用内部子例程GET COMMAND ARGUMENT在一个基本上是这样的程序中 program test character len 100 argument call GET COMM
  • Java加密问题

    我正在使用 PBE 加密来加密和解密 Android 应用程序上的某些文本 但当我使用错误的私钥解密文本时 我收到 BadPaddingException 并显示 填充块损坏 消息 我的问题是 由于我不太熟悉 Java 中的加密 这是否是加
  • 无法将路由器服务传递给 symfony 2.6 中的 twig 扩展

    我有一个树枝扩展 我试图在其中注入路由器服务 所以 服务 yml app twig extension class SeoReportBundle Twig SeoReportExtension arguments router tags
  • 发布到IIS后.Net core服务不可用

    当我将 up 发布到 IIS 后 当我尝试访问它时 出现错误 暂停服务 http错误503服务不可用 接下来我应该做什么 我使用 Windows Server 2008 64 位 和 IIS 8 5 该应用程序是Web api NET CO
  • php xpath 问题

    我正在尝试使用 xpath 解析 blogspot feed 但它似乎不适用于我尝试的任何内容 我不确定这是因为名称空间还是什么原因 但我希望有人可以帮助我 这是代码 xml simplexml load file http feeds f
  • NS3-如何在模拟运行期间修改点对点通道数据速率

    我是 NS3 新手 正在查看first cc 教程 https www nsnam org doxygen first 8cc source html https www nsnam org doxygen first 8cc source
  • 如何使用新的反应路由器钩子测试组件?

    到目前为止 在单元测试中 React 路由器匹配参数被检索为组件的 props 因此 考虑某些特定匹配和特定 url 参数来测试组件很容易 我们只需在测试中渲染组件时按照我们想要的方式精确匹配路由器匹配的 props 我为此目的使用酶库 我
  • 停止 LINQ to SQL 在插入后执行 select 语句

    我正在使用 LINQ to SQL 来更新我的数据库 我正在插入大量记录 当我调用 SubmitChanges 时 LINQ to SQL 会为每个对象执行一条插入和一条选择语句 我真的不关心将对象插入数据库后更新它们 您知道我可以阻止 L
  • 如何通过代码启用对 URI 类的 IDN/IRI 支持?

    我正在尝试为 URI 类启用 IDN IRI 支持 因为我需要德国变音域 例如 www b cher de 上的 Uri IsWellFormedUriString 方法 我发现类似的问题https stackoverflow com a