C#学习教程:如何创建使用GenericUriParserOptions.DontCompressPath解析的Uri实例方案和主机名是有界的。它还会修剪每个路径段的尾随周期。后一个特性对于OpenID应用程序来说是致命的,因为一些OpenIDs(比如从Yahoo发布的)包括base64编码的路径段,可以以句点结尾。如何禁用Uri类的周期修剪行为?使用UriParser.Register注册我自己的方案,使用UriParser.Register初始化的解析器避免了循环修剪,以及其他一些对OpenID也不受欢迎的操作。但我无法为HTTP和HTTPS等现有方案注册新的解析器,我必须为OpenID注册。我尝试的另一种方法是注册我自己的新方案,并编写自定义解析器以将方案改回标准HTTP方案作为解析的一部分:publicMyUriParser(stringactualScheme):base(GenericUriParserOptions.DontCompressPath){this.actualScheme=actualScheme.ToLowerInvariant();}protectedoverridestringGetComponents(Uriuri,UriComponentscomponents,UriFormatformat){stringresult=base.GetComponents(uri,components,format)//在字符串中替换我们实际需要的方案(如果它在那里)。if((components&UriComponents.Scheme)!=0){stringregisteredScheme=base.GetComponents(uri,UriComponents.Scheme,format);结果=this.actualScheme+结果.Substring(registeredScheme.Length);}返回结果;}}classProgram{staticvoidMain(string[]args){UriParser.Register(newMyUriParser("http"),"httpx",80);UriParser.Register(newMyUriParser("https"),"httpsx",443);Uriz=newUri("httpsx://me.yahoo.com/b./c.#adf");变量请求=(HttpWebRequest)WebRequest.Create(z);req.GetResponse();这实际上几乎在所有Uri实例报告https而不是httpsx的地方都有效——除了Uri.Scheme属性本身。当您将此Uri实例传递给HttpWebRequest以向此地址发送请求时,这是一个问题。显然它会检查Scheme属性并且不会将其识别为“https”,因为它只是将明文发送到端口443而不是SSL。我很高兴有任何解决方案:Uri.Path中的尾随句子保留路径段Uri.Path在传出HTTP请求中包含这些句点。非常适合ASP.NET中等信任(但并非绝对必要)。微软表示它将在.NET4.0中修复(尽管从评论看来它尚未修复)https://connect.microsoft.com/VisualStudio/feedback/details/386695/system-uri-incorrectly-strips-trailing-dots?wa=wsignin1.0#tabs但是,该页面上有一个解决方法。它涉及使用反射来更改选项,因此它可能不满足中等信任要求。只需滚动到底部,然后单击“解决方案”选项卡。ThankstojxdavisandGooglefortheanswer:http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/5206beca-071f-485d-a2bd-657d635239c9I'mcuriousifpartoftheproblemisthatyouonlyconsider“不压缩路径”,而不是基本HTTP解析器的所有默认值:(包括UnEscapeDotsAndSlashes)privateconstUriSyntaxFlagsHttpSyntaxFlags=(UriSyntaxFlags.AllowIriParsing|UriSyntaxFlags.AllowIdn|UriSyntaxFlags.UnEscapeDotsAndSlashes|UriSyntaxFlags.CanonicalizeAsFilePath|UriSyntaxFlags.CompressPath|UriSyntaxFlags.ConvertPathSlashes|UriSyntaxFlags.PathIsRooted|UriSyntaxFlags.AllowAnInternetHost|UriSyntaxFlags.AllowUncHost|UriSyntaxFlags.MayHaveFragment|UriSyntaxFlags.MayHaveQuery|UriSyntaxFlags.MayHavePath|UriSyntaxFlags.MayHavePort|UriSyntaxFlags.MayHaveUserInfo|UriSyntaxFlags.MustHaveAuthority);这与有标志的新闻相反(例如):privateconstUriSyntaxFlagsNewsSyntaxFlags=(UriSyntaxFlags.AllowIriParsing|UriSyntaxFlags.MayHaveFragment|UriSyntaxFlags.MayHavePath);Dang,BrandonBlackbeatmetotyping...thismighthelpcodereadability:namespaceSystem{[Flags]internalenumUriSyntaxFlags{AllowAnInternetHost=0xe00,AllowAnyOtherHost=0x1000,AllowDnsHost=0x200,AllowDOSPath=0x100000,AllowEmptyHost=0x80,AllowIdn=0x4000000,AllowIPv4Host=0x400,AllowIPv6Host=0x800,AllowIriParsing=0x10000000,AllowUncHost=0x100,BuiltInSyntax=0x40000,CanonicalizeAsFilePath=0x1000000,CompressPath=0x800000,ConvertPathSlashes=0x400000,FileLikeUri=0x2000,MailToLikeUri=0x4000,MayHaveFragment=0x40,MayHavePath=0x10,MayHavePort=8,MayHaveQuery=0x20,MayHaveUserInfo=4,MustHaveAuthority=1,OptionalAuthority=2,ParserSchemeOnly=0x80000,PathIsRooted=0x200000,SimpleUserSyntax=0x20000,UnEscapeDotsAndSlashes=0x2000000,V1_UnknownUri=0x10000}}你应该可以使用'%2E'来转义'',但这是廉价而肮脏的出路你可以试试dontEscape选项,它可能会改变Uri处理这些字符的方式。更多信息:http://msdn.microsoft.com/en-us/library/system.uri.aspx另请参阅以下内容(参见DontUnescapePathDotsAndSlashes):http://msdn.microsoft.com/en-us/library/system.genericuriparseroptions.aspx这个有用吗?以上就是C#学习教程的全部内容:HowtocreateaUriinstanceparsedusingGenericUriParserOptions.DontCompressPath。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicclassMyUriParser:UriParser{privatestringactualScheme;publicMyUriParser(stringactualScheme){Typetype=this.GetType();FieldInfofInfo=type.BaseType.GetField("m_Flags",BindingFlags.Instance|BindingFlags.NonPublic);fInfo.SetValue(this,GenericUriParserOptions.Dont)Compress;this.actualScheme=actualScheme.ToLowerInvariant();}protectedoverridestringGetComponents(Uriuri,UriComponentscomponents,UriFormatformat){stringresult=base.GetComponents(uri,components,format);//在字符串中替换我们实际需要的方案(如果它在那里)。if((components&UriComponents.Scheme)!=0){stringregisteredScheme=base.GetComponents(uri,UriComponents.Scheme,格式);结果=this.actualScheme+result.Substring(registeredScheme.Length);}返回结果;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
