如何建立一个网址?

Ian*_*oyd 60 .net c#

.NET中是否有可用的助手类来构建Url?

例如,如果用户输入字符串:

stackoverflow.com
Run Code Online (Sandbox Code Playgroud)

我试着把它传递给HttpWebRequest:

WebRequest.CreateHttp(url);
Run Code Online (Sandbox Code Playgroud)

它将失败,因为它不是有效的URL(它没有前缀).

我想要的是能够解析用户输入的部分网址:

Uri uri = new Uri(url);
Run Code Online (Sandbox Code Playgroud)

然后修复缺失的部分:

if (uri.Port == 0)
   uri.Port = 3333;
if (uri.Scheme == "")
   uri.Scheme = "https";
Run Code Online (Sandbox Code Playgroud)

.NET是否有任何可用于解析和操作Uri的类?

UriBuilder类无法完成这项工作

用户输入的值(例如stackoverflow.com:3333)有效; 我只需要一个班级来分开它.我尝试使用这个UriBuilder类:

UriBuilder uriBuilder = new UriBuilder("stackoverflow.com:3333");
Run Code Online (Sandbox Code Playgroud)

不幸的是,UriBuilder类无法处理URI:

  • uriBuilder.Path = 3333
  • uriBuilder.Port = -1
  • uriBuidler.Scheme = stackoverflow.com

所以我需要一个能够理解的课程,host:port尤其是当课程不是特别http重要时,尤其如此.

奖金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

Url的格式为:

  foo://example.com:8042/over/there?name=ferret#nose
  \_/   \_________/ \__/\_________/\__________/ \__/
   |         |        |     |           |        |
scheme      host    port   path       query   fragment
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 60

如果您需要确保某些字符串作为用户输入是有效的URL,您可以使用以下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
}
Run Code Online (Sandbox Code Playgroud)

现在,如果另一方面,您想要在.NET中构建URL,那么就是UriBuilder专门为此目的而设计的类.我们来举个例子吧.假设您要构建以下URL: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
Run Code Online (Sandbox Code Playgroud)

  • `HttpUtility.ParseQueryString` 是获取内部 `HttpValueCollection` 的一种偷偷摸摸的方式(这就是为什么它的 `.ToString()` 是这样工作的)。不确定使用内部框架类并依赖其未记录的行为是否是个好主意。此见解的功劳归功于 https://codereview.stackexchange.com/questions/91783/constructing-a-query-string-using-stringbuilder#comment166606_91795 (2认同)

Lee*_*Lee 15

您可以使用UriBuilder类.

var builder = new UriBuilder(url);
builder.Port = 3333
builder.Scheme = "https";

var result = builder.Uri;
Run Code Online (Sandbox Code Playgroud)

  • 它在`stackoverflow.com:3389`上窒息 (2认同)

小智 8

为了有效,URI 需要具有方案组件。“server:8088”不是有效的 URI。“http://server:8088”是。参见https://www.rfc-editor.org/rfc/rfc3986

  • @IanBoyd:有些浏览器只知道最常见的拼写错误是什么,并自行调整;-) (4认同)
  • @Ian:Chrome 只是检测到解析失败并再次尝试,这次使用 `"https://" + userinput` 这不是 URL 操作,而是字符串操作。 (4认同)
  • 实际上,server:8080 是一个完全有效的 URI,尽管可能没有人会理解服务器方案的含义。 (2认同)