Как создать URL?
Есть ли какие-либо вспомогательные классы, доступные в .NET, чтобы я мог создать Url?
Например, если пользователь вводит строку:
stackoverflow.com
и я пытаюсь передать это на HttpWebRequest
:
WebRequest.CreateHttp(url);
Это не сработает, потому что это не действительный url (у него нет префикса).
Я хочу, чтобы можно было проанализировать частичный URL-адрес пользователя:
Uri uri = new Uri(url);
а затем исправить недостающие фрагменты:
if (uri.Port == 0)
uri.Port = 3333;
if (uri.Scheme == "")
uri.Scheme = "https";
Имеет ли .NET какие-либо классы, которые могут использоваться для анализа и управления Uri's?
Класс 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
, что особенно важно, когда это не особенно 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
Ответы
Ответ 1
Если вам нужно убедиться, что некоторая строка, поступающая как пользовательский ввод, является действительным 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
}
Теперь, если вы хотите создавать URL-адреса в .NET, это класс UriBuilder
, специально предназначенный для этой цели. Возьмем пример. Предположим, вы хотели создать следующий URL: 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
Ответ 2
Вы можете использовать класс UriBuilder.
var builder = new UriBuilder(url);
builder.Port = 3333
builder.Scheme = "https";
var result = builder.Uri;
Ответ 3
Чтобы быть допустимым, URI должен иметь компонент схемы. "server: 8088" не является допустимым URI. " http://server:8088". См. https://tools.ietf.org/html/rfc3986