如何建立一个网址?

时间:2013-11-23 15:44:05

标签: c# .net

.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时尤其重要。

Bonus Chatter

控制台应用程序。

来自其他问题

需要解析的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

3 个答案:

答案 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其中barbazinga值来自用户:

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