【发布时间】:2013-12-08 11:32:08
【问题描述】:
.NET 中是否有任何帮助类可以让我构建 Url?
例如,如果用户输入一个字符串:
stackoverflow.com
我尝试将其传递给HttpWebRequest:
WebRequest.CreateHttp(url);
它会失败,因为它不是一个有效的 url(它没有前缀)。
我想要的是能够解析用户输入的部分网址:
Uri uri = new Uri(url);
然后修复缺失的部分:
if (uri.Port == 0)
uri.Port = 3333;
if (uri.Scheme == "")
uri.Scheme = "https";
.NET 是否有任何可用于解析和操作 Uri 的类?
UriBuilder 类无法完成这项工作
用户输入的值(例如stackoverflow.com:3333)有效;我只需要一堂课来把它分开。我尝试过使用UriBuilder 类:
UriBuilder uriBuilder = new UriBuilder("stackoverflow.com:3333");
很遗憾,UriBuilder 类无法处理 URI:
- uriBuilder.Path =
3333 - uriBuilder.Port =
-1 - uriBuidler.Scheme =
stackoverflow.com
所以我需要一个能够理解host:port 的课程,这在it's not particularly http, but could be 时尤为重要。
奖金聊天
控制台应用程序。
从另一个问题
一些需要解析的 URL 示例:
-
server:8088 server:8088/func1server:8088/func1/SubFunc1http://serverhttp://server/func1http://server/func/SubFunc1http://server:8088http://server:8088/func1http://server:8088/func1/SubFunc1magnet://servermagnet://server/func1magnet://server/func/SubFunc1magnet://server:8088magnet://server:8088/func1magnet://server:8088/func1/SubFunc1http://[2001:db8::1]http://[2001:db8::1]:80
Url 的格式为:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \_________/ \__/\_________/\__________/ \__/
| | | | | |
scheme host port path query fragment
奖金聊天
再次指出 UriBuilder 不起作用:
【问题讨论】:
-
看起来
UriBuilder正确处理了这个问题——stackoverflow.com:3333是一个 URI,其方案为stackoverflow.com,路径为3333。如果您想要以不同方式解析它,则必须指定您希望行为如何不同。您可能只能假设未知方案是主机名,或者编写自己的 UriParser。 -
问题是方案不是
stackoverflow.com。只需询问 Lynx、Netscape Navigator、Internet Explorer、FireFox、Chrome、Edge 和 living standard。他们都意识到stackoverflow.com是主机。我想要每个实际的现实世界解析器都能理解的 Uri 解析器。如果您建议我自己编写,那很好 - 请参阅 this question 我询问如何操作。理想情况下,该类已经存在于 FCL 中。