Complete address [knowledge] Uri object

Sending a request through HttpClient, you can set the BaseAddress, after the incoming requests directly to the relative address:

1 using(var httpClient = new HttpClinet())
2 {
3     httpClient.BaseAddress = new Uri("http://localhost:8082");
4     await httpClient.GetAsync("Users");  // GET http://localhost:8082/Users
5     await httpClient.PutAsync("User/123", xx);  // PUT http://localhost:8082/User/123
6 }

But here too there is a pit, that is, whether the incoming Uri "/" at the end or beginning, will make the final address of the requested changes.
To be a test:

 1 var baseUri = new Uri("http://localhost:8082/api");
 2 var relativeUri = new Uri("Users", UriKind.Relative);
 3 var requestUri = new Uri(baseUri, relativeUri);
 4 Console.WriteLine(requestUri);  // http://localhost:8082/Users
 5 
 6 var baseUri = new Uri("http://localhost:8082/api/");
 7 var relativeUri = new Uri("Users", UriKind.Relative);
 8 var requestUri= new Uri(baseUri , relativeUri);
 9 Console.WriteLine(requestUri);  // http://localhost:8082/api/Users
10 
11 var baseUri = new Uri("http://localhost:8082/api");
12 var relativeUri = new Uri("/Users", UriKind.Relative);
13 var requestUri= new Uri(baseUri, relativeUri);
14 Console.WriteLine(requestUri);  // http://localhost:8082/Users
15 
16 var baseUri = new Uri("http://localhost:8082/api/");
17 var relativeUri = new Uri("/Users", UriKind.Relative);
18 var requestUri= new Uri(baseUri, relativeUri);
19 Console.WriteLine(requestUri);  // http://localhost:8082/Users

As can be seen, only baseUri end with "/", and relativeUri does not begin with "/", you will get a complete Uri, the other will be missing "api" this part.
Find official document, you can find instructions ( Uri constructor ):

1, if relativeUri is an absolute address, the address is in the final relativeUri
2, if baseUri section contains a relative, then only reserved "/" at the end opposite portions
3, if relativeUri starts with "/", it will replace all baseUri opposite portions

Subsequently the test conditions described above:

 1 var baseUri = new Uri("http://localhost:8082/api");
 2 var relativeUri = new Uri("http://localhost:8082/api2");
 3 var requestUri = new Uri(baseUri, relativeUri);
 4 Console.WriteLine(requestUri);  // http://localhost:8082/api2
 5 
 6 var baseUri = new Uri("http://localhost:8082/api/test");
 7 var relativeUri = new Uri("Users", UriKind.Relative);
 8 var requestUri = new Uri(baseUri, relativeUri);
 9 Console.WriteLine(requestUri);  // http://localhost:8082/api/Users
10 
11 var baseUri = new Uri("http://localhost:8082/api/test/");
12 var relativeUri = new Uri("Users", UriKind.Relative);
13 var requestUri = new Uri(baseUri, relativeUri);
14 Console.WriteLine(requestUri);  // http://localhost:8082/api/test/Users
15 
16 var baseUri = new Uri("http://localhost:8082/api/test/");
17 var relativeUri = new Uri("/Users", UriKind.Relative);
18 var requestUri = new Uri(baseUri, relativeUri);
19 Console.WriteLine(requestUri);  // http://localhost:8082/Users
20 
21 var baseUri = new Uri("http://localhost:8082/api/test/");
22 var relativeUri = new Uri("/User/123/", UriKind.Relative);
23 var requestUri = new Uri(baseUri, relativeUri);
24 Console.WriteLine(requestUri);  // http://localhost:8082/User/123/

The results are clear, the final priority Uri depends relativeUri, followed depending baseUri.

However, if only baseUri or relativeUri, it will press "/" to separate it? Continue to test:

 1 var baseUri = new Uri("http://localhost:8082/api/test/");
 2 var relativeUri = new Uri("http://localhost:8082/api2/test");
 3 var requestUri = new Uri(baseUri, relativeUri);
 4 Console.WriteLine(requestUri);  // http://localhost:8082/api2/test
 5 
 6 var baseUri = new Uri("http://localhost:8082/api/test");
 7 var relativeUri = new Uri("/", UriKind.Relative);
 8 var requestUri = new Uri(baseUri, relativeUri);
 9 Console.WriteLine(requestUri);  // http://localhost:8082/
10 
11 var baseUri = new Uri("http://localhost:8082/api/test");
12 var relativeUri = new Uri("", UriKind.Relative);
13 var requestUri = new Uri(baseUri, relativeUri);
14 Console.WriteLine(requestUri);  // http://localhost:8082/api2/test
15 
16 var relativeUri = new Uri("/api/Users", UriKind.Relative);
17 Console.WriteLine(relativeUri);  // /api/Users

Therefore, according to the test results can be added to two rules:
1, if relativeUri is an absolute address, then completely relativeUri, regardless of whether the "/" at the end
2, if only baseUri or relativeUri, then no treatment

In addition, interested can decompile System.dll look Uri object implementation.

Guess you like

Origin www.cnblogs.com/linys2333/p/11025094.html