.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的类?
用户输入的值(例如stackoverflow.com:3333
)有效;我只需要一个班级来分开它。我尝试使用UriBuilder
类:
UriBuilder uriBuilder = new UriBuilder("stackoverflow.com:3333");
不幸的是,UriBuilder类无法处理URI:
3333
-1
stackoverflow.com
所以我需要一个能理解host:port
的课程,这在it's not particularly http
, but could be时尤其重要。
控制台应用程序。
需要解析的URL的一些示例:
server:8088
server:8088/func1
server:8088/func1/SubFunc1
http://server
http://server/func1
http://server/func/SubFunc1
http://server:8088
http://server:8088/func1
http://server:8088/func1/SubFunc1
magnet://server
magnet://server/func1
magnet://server/func/SubFunc1
magnet://server:8088
magnet://server:8088/func1
magnet://server:8088/func1/SubFunc1
网址格式为:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \_________/ \__/\_________/\__________/ \__/
| | | | | |
scheme host port path query fragment
答案 0 :(得分:58)
如果您需要确保某些字符串作为用户输入有效,则可以使用Uri.TryCreate
方法:
Uri uri;
string someUrl = ...
if (!Uri.TryCreate(someUrl, UriKind.Absolute, out uri))
{
// the someUrl string did not contain a valid url
// inform your users about that
}
else
{
var request = WebRequest.Create(uri);
// ... safely proceed with executing the request
}
现在,如果另一方面你想在.NET中构建URL,那么专门为此目的设计的UriBuilder
类。我们来举个例子吧。假设您要构建以下网址:http://example.com/path?foo=bar&baz=bazinga#some_fragment
其中bar
和bazinga
值来自用户:
string foo = ... coming from user input
string baz = ... coming from user input
var uriBuilder = new UriBuilder("http://example.com/path");
var parameters = HttpUtility.ParseQueryString(string.Empty);
parameters["foo"] = foo;
parameters["baz"] = baz;
uriBuilder.Query = parameters.ToString();
uriBuilder.Fragment = "some_fragment";
Uri finalUrl = uriBuilder.Uri;
var request = WebRequest.Create(finalUrl);
... safely proceed with executing the request
答案 1 :(得分:16)
您可以使用UriBuilder类。
var builder = new UriBuilder(url);
builder.Port = 3333
builder.Scheme = "https";
var result = builder.Uri;
答案 2 :(得分:3)
要使URI有效,需要拥有方案组件。 "服务器:8088"不是有效的URI。 " http://server:8088"是。见https://tools.ietf.org/html/rfc3986