System.Net.Http
рдЕрдм рд░реЗрдкреЛ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :smile: :tada: :balloon:
рдЬрдм рднреА рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ => рдореЗрд░реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрдд рдмрд┐рдВрджреБ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА рд╣рд┐рдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╕рджрд┐рдпреЛрдВ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ @davidfowl рд╕реЗ рдкреВрдЫрд╛ рдерд╛ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЙрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕реЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрджреНрдзреГрдд рдирд╣реАрдВ рдХрд░рддрд╛ - рд▓реЗрдХрд┐рди рдЙрд╕рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ рдПрдХ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ (рдпрд╛рдиреА HttpClientHandler
) рдХреЛ рдирдХрд▓реА рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрд╕реЗ рддрд╛рд░ рджреЗрдВ, рдЖрджрд┐ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HttpClient.Helpers рдирд╛рдордХ рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред
рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдпрд╣ _very_ рдЧрдиреНрджрд╛ рдФрд░ .. рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВ рдЬрд┐рд╕реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдореЗрд░реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ? рдЬреИрд╕реЗ .. рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд┐рд░реНрдл IHttpClient
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
HttpClient
рдПрдХ рдЕрдиреНрдп HTTP рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдПрдХ рдЕрдореВрд░реНрдд рдкрд░рдд рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЖрдкрдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдпрддрд╛рддреНрдордХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрддрдиреА рд╣реА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред
рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, HttpClient
рд╕реНрд╡рдпрдВ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдФрд░ "рдирдХрд▓реА" рдСрдмреНрдЬреЗрдХреНрдЯ рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ HttpMessageHandler
рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ) рдЗрд╕реЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ рд╕рдорд╛рдзрд╛рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ?
@PureKrome - рдЗрд╕реЗ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЯрдХрд░рд╛рдП рдмрд┐рдирд╛ HttpClient рдХреЛ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ -
рддрдм рдЖрдкрдХрд╛ HttpClient рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдирдмрд┐рд▓реНрдЯ HttpClientHandler рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдзрдиреНрдпрд╡рд╛рдж,
рд╕рд┐рдб
рдирдорд╕реНрддреЗ @SidharthNabar - рдореЗрд░реЗ рдореБрджреНрджреЗ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рднреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред
рдПрдХ рдирдпрд╛ рд╣реИрдВрдбрд▓рд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ
рддреБрдордиреЗ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ :)
рдпрд╣ рдЭреВрдордиреЗ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдмрдбрд╝рд╛ рдиреГрддреНрдп рд╣реИ, рдмрд╕ рдореЗрд░рд╛ рдЕрд╕рд▓реА рдХреЛрдб рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ _рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд╣рд┐рдЯ рди рдХрд░реЗрдВ_ред
рдореИрдВрдиреЗ рдПрдХ HttpClient.Helpers repo рдФрд░ nuget рдкреИрдХреЗрдЬ рднреА рдмрдирд╛рдпрд╛ рд╣реИ .. рдмрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП! рдкрд░рд┐рджреГрд╢реНрдп рдХреА рддрд░рд╣ рд╣реИрдкреНрдкреА рдкрде рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдПрдВрдбрдкреЙрдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдЕрдкрд╡рд╛рдж ...
рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ -> рдХреНрдпрд╛ рд╣рдо рдпрд╣ рд╕рдм рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ ... рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рд░реНрдл рдПрдХ рдирдХрд▓реА рд╡рд┐рдзрд┐?
рдореИрдВ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ рдФрд░ рд╕рдордЭрд╛рдКрдВрдЧрд╛ ..
public async Foo GetSomethingFromTheInternetAsync()
{
....
using (var httpClient = new HttpClient())
{
html = await httpClient.GetStringAsync("http://www.google.com.au");
}
....
}
рдЖрдЗрдП рджреЛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрджрд┐ рдпрд╣ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реИ):
public interface IHttpClient
{
Task<string> GetStringAsync(string requestUri);
}
рдореЗрд░рд╛ рдХреЛрдб рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ ...
public class SomeService(IHttpClient httpClient = null)
{
public async Foo GetSomethingFromTheInternetAsync()
{
....
using (var httpClient = _httpClient ?? new HttpClient()) // <-- CHANGE dotnet/corefx#1
{
html = await httpClient.GetStringAsync("http://www.google.com.au");
}
....
}
}
рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ
public async Task GivenAValidEndPoint_GetSomethingFromTheInternetAsync_ReturnsSomeData()
{
// Create the Mock : FakeItEasy > Moq.
var httpClient = A.Fake<IHttpClient>();
// Define what the mock returns.
A.CallTo(()=>httpClient.GetStringAsync("http://www.google.com.au")).Returns("some html here");
// Inject the mock.
var service = new SomeService(httpClient);
...
}
рд╡рд╛рд╣! рдХрд┐рдпрд╛ рд╣реБрдЖред
рдареАрдХ рд╣реИ, рдЕрдм рд╡рд░реНрддрдорд╛рди рддрд░реАрдХреЗ рд╕реЗ...
public class SomeService(IHttpClient httpClient = null)
{
public async Foo GetSomethingFromTheInternetAsync()
{
....
using (var httpClient = _handler == null
? new HttpClient()
: new HttpClient(handler))
{
html = await httpClient.GetStringAsync("http://www.google.com.au");
}
....
}
}
рд▓реЗрдХрд┐рди рджрд░реНрдж рдЕрдм рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрд▓рд╛рд╕ рдХрд░рдиреА рдкрдбрд╝ рд░рд╣реА рд╣реИред рддреБрдордиреЗ рдЕрдм рдореБрдЭреЗ рдЪреЛрдЯ рдкрд╣реБрдВрдЪрд╛рдИ рд╣реИред
public class FakeHttpMessageHandler : HttpClientHandler
{
...
}
рдФрд░ рдпрд╣ рдХрдХреНрд╖рд╛ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЬрдм рддрдХ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХрд╛рдзрд┐рдХ GetAsync calls
(рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдПрдХрд╛рдзрд┐рдХ рд╣реИрдВрдбрд▓рд░ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?) -рдпрд╛- рдПрдХ рд╣реА рд╕реЗрд╡рд╛ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ httpClientsред рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рд╣рдо рд╣реИрдВрдбрд▓рд░ рдХрд╛ Dispose
рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рддрд░реНрдХ рдХреЗ рдПрдХ рд╣реА рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЬреЛ рдПрдХ рд╕реАрдЯреАрдЖрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ)?
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
public async Foo GetSomethingFromTheInternetAsync()
{
string[] results;
using (var httpClient = new HttpClient())
{
var task1 = httpClient.GetStringAsync("http://www.google.com.au");
var task2 = httpClient.GetStringAsync("http://www.microsoft.com.au");
results = Task.WhenAll(task1, task2).Result;
}
....
}
рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдЗрддрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ..
var httpClient = A.Fake<IHttpClient>();
A.CallTo(() = >httpClient.GetStringAsync("http://www.google.com.au"))
.Returns("gooz was here");
A.CallTo(() = >httpClient.GetStringAsync("http://www.microsoft.com.au"))
.Returns("ms was here");
рд╕рд╛рдл рд╕рд╛рдл рд╕рд╛рдл :)
рдлрд┐рд░ - рдЕрдЧрд▓рд╛ рдмрд┐рдЯ рд╣реИ: рдЦреЛрдЬ рдпреЛрдЧреНрдпрддрд╛
рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ MS.Net.Http.HttpClient
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рддреЛ рдПрдкреАрдЖрдИ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдерд╛: +1: рдареАрдХ рд╣реИ - рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░реЗрдВ .. рд╕рд░рд▓ ...
... рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ .... рдФрд░ рдЕрдм рдореБрдЭреЗ HttpClientHandlers
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИ? рдЙрдо рдХреНрдпреЛрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдХрд╡рд░ рдХреЗ рдиреАрдЪреЗ рдЫреБрдкрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдореБрдЭреЗ рдЗрд╕ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рддреЛ рдЬреНрдпрд╛рджрд╛ рд╣реИ! рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдореБрдЭреЗ рдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреБрдЫ рдкреНрд▓рдВрдмрд┐рдВрдЧ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП ... рдЬреЛ рджрд░реНрдж рд╣реЛрддрд╛ рд╣реИ: рд░реЛрдирд╛:
рдпрд╣ рд╕рдм рдЖрдИрдПрдордУ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред
рдореЗрд░реА рдорджрдж рдХрд░реЗрдВ Microsoft - рдЖрдк рд╣реА рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдЖрд╢рд╛ рд╣реИрдВред
рдореБрдЭреЗ рднреА рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рднрд┐рдиреНрди рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рдФрд░ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред :+1:
рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ - рдпрд╣ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИред рдПрдХ HttpClient рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдирд╛ рдФрд░ рдЕрдкрдиреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓рд┐рдВрдЧ рдФрд░ рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ HttpClient рдХреЗ рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдирдХрд▓реА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХрд╛ рдХрд╛рдо рд╣реЛ рдЧрдпрд╛ред
рджреВрд╕рд░рд╛ - рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВред HttpClient рдХрд╛ API рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реБрджреНрдз рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдЖрдзрд╛рд░рд┐рдд рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдЙрдзрд╛рд░ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐/рдлрд╝реИрдХреНрдЯрд░реА рдкреИрдЯрд░реНрди рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЙрд╕ рдлрд╝реИрдХреНрдЯрд░реА рд╕реЗ рдпрд╛ рдЙрд╕рдХреЗ рдмрд╛рдж рдмрдирд╛рдП рдЧрдП рд╕рднреА HttpClient рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдордиреЗ рдЕрднреА рддрдХ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдмрдирд╛ рд░рд╣реЗрдЧрд╛ - рдЖрдкрдХреЛ рдПрдХ рдирдХрд▓реА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ HttpClient рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдиреАрдЪреЗ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
@ericstj - рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░?
рдзрдиреНрдпрд╡рд╛рдж,
рд╕рд┐рдбред
@SidharthNabar рдЖрдк/рдЯреАрдо рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рдЗрддрдиреЗ рд╕рдВрдХреЛрдЪ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкреВрд░реЗ рдмрд┐рдВрджреБ рдХреЛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ _learn_ рдФрд░ рдлрд┐рд░ _create_ рдирдХрд▓реА рд╣реИрдВрдбрд▓рд░ рдХрдХреНрд╖рд╛рдПрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдиреЗ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо, рд╣рд╛рдЗрд▓рд╛рдЗрдЯ) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рджрд░реНрдж рдмрд┐рдВрджреБ рд╣реИ?
рд╣рд╛рдБ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдХ рдмреБрд░реА рдЪреАрдЬ рдХреНрдпреЛрдВ рд╣реЛрдЧреАред рдпрд╣ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЗрддрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред
рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рд▓реЛрдЧ рд╣рдореЗрд╢рд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдврд╛рдВрдЪреЗ рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рджрд╕реНрдп рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдпрд╣ рдЯреВрдЯрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ред @KrzysztofCwalina рдпрд╛ @terrajobst рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдзрд┐рдХ рдЗрддрд┐рд╣рд╛рд╕/рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдореБрджреНрджрд╛ рдПрдХ рдирд┐рдХрдЯ рдзрд╛рд░реНрдорд┐рдХ рдмрд╣рд╕ рд╣реИ: рдореИрдВ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реВрдВред
рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкрд╛рд╕ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдпрд╣ рд╕реАрд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рджрд╕реНрдп рдЖрднрд╛рд╕реА рд╣реИрдВред рдЗрд╕рдореЗрдВ рдПрдХ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде HttpMessageHandler рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреЙрдЗрдВрдЯ рдХреЛ @sharwell рдмрддрд╛рддреЗ рд╣реБрдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред IMO рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ API рд╣реИ, @HenrikFrystykNielsen рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
:+1: рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
:рд╡реЗрд╡: @ericstj рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдвреЗрд░: +1:: рдХреЗрдХ:
рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╣рд╛рдБ - рдорд╣рд╛рди рдмрд┐рдВрджреБред
рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдореБрджреНрджрд╛ рдПрдХ рдирд┐рдХрдЯ рдзрд╛рд░реНрдорд┐рдХ рдмрд╣рд╕ рд╣реИ
рд╣рд╛рдБ ... рдЙрд╕ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ред
HttpClient рдХреЗ рдкрд╛рд╕ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ
рдУрд╣? рдореИрдВ рдЗрд╕ рдкрд░ рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: рдмреНрд▓рд╢: рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдХрд╛рд░рдг: рдмреНрд▓рд╢:
рдпрд╣ рд╕реАрд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рджрд╕реНрдп рдЖрднрд╛рд╕реА рд╣реИрдВред
рд╕рджрд╕реНрдп рдЖрднрд╛рд╕реА рд╣реИрдВ? рдУрд╣ рдбреНрд░реЗрдЯреНрд╕, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛! рдпрджрд┐ рд╡реЗ рдЖрднрд╛рд╕реА рд╣реИрдВ, рддреЛ рдирдХрд▓реА рдврд╛рдВрдЪреЗ рдЙрди рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ: +1: рдФрд░ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!
рдЖрдЗрдП рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ HttpClient.cs рдкрд░ ...
public Task<HttpResponseMessage> GetAsync(string requestUri) { .. }
public Task<HttpResponseMessage> GetAsync(Uri requestUri) { .. }
рд╣рдореНрдоред рд╡реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдирд╣реАрдВ рд╣реИрдВ ... рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрдЬрдиреЗ рджреЗрдВ ... рдПрд░ .. рдХреЛрдИ virtual
рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рдорд┐рд▓рд╛ред рддреЛ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм _other_ рд╕рджрд╕реНрдпреЛрдВ рд╕реЗ _other related_ рдХреНрд▓рд╛рд╕реЗрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рд╣реИрдВ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ .. рддреЛ рд╣рдо рдЙрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ рдЬреЛ рдореИрдВ рдЙрдард╛ рд░рд╣рд╛ рд╣реВрдВ - рд╣рдореЗрдВ рдЕрдм рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ GetAsync
рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдмрдирд╛рдирд╛ рд╣реИ/рд╡рд╛рдпрд░рдЕрдк/рдЖрджрд┐...
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рд╕рдордЭ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реВрдБ, рдпрд╣рд╛рдБ ┬п(┬░_┬░)/┬п ?
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╢рд╛рдпрдж рд╡реЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрднрд╛рд╕реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ? рдореИрдВ рдкреАрдЖрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ!
SendAsync рд╡рд░реНрдЪреБрдЕрд▓ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдКрдкрд░ рд▓рдЧрднрдЧ рд╣рд░ рджреВрд╕рд░реА API рд▓реЗрдпрд░ рд╣реИред 'рдЕрдзрд┐рдХрд╛рдВрд╢' рдЧрд▓рдд рдерд╛, рдореЗрд░реА рдпрд╛рджрджрд╛рд╢реНрдд рд╡рд╣рд╛рдВ рдЧрд▓рдд рдХрд╛рдо рдХрд░рддреА рд╣реИред рдореЗрд░реА рдзрд╛рд░рдгрд╛ рдпрд╣ рдереА рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЖрднрд╛рд╕реА рдереЗ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рдЖрднрд╛рд╕реА рд╕рджрд╕реНрдп рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмрдиреЗ рдереЗред рдЖрдо рддреМрд░ рдкрд░ рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ рдЖрднрд╛рд╕реА рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реЗ рдУрд╡рд░рд▓реЛрдб рдХреЛ рд╡реНрдпрд╛рдкрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВред SendAsync рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдзрд┐рднрд╛рд░ рд╣реИ рдЬреЛ рдЖрднрд╛рд╕реА рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрд╣! рдЧреЛрдЪрд╛: рдмреНрд▓рд╢: рддреЛ рд╡реЗ рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдВ SendAsync
.. рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддреА рд╣реИрдВ .. рдЬреЛ рд╕рднреА рднрд╛рд░реА рднрд╛рд░реЛрддреНрддреЛрд▓рди рдХрд░рддрд╛ рд╣реИред рддреЛ рдЗрд╕рдХрд╛ рдЕрднреА рднреА рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдПрдХ рдЦреЛрдЬ рдпреЛрдЧреНрдпрддрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ .. рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рддрд░рдл рд░рдЦ рджреЗрдВ (рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рд╣рдо SendAsync
рдХрд╛ рдордЬрд╝рд╛рдХ рдХреИрд╕реЗ рдЙрдбрд╝рд╛рдПрдВрдЧреЗ рдпрд╣ рдореВрд▓ рдирдореВрдирд╛ рджреЗрдВрдЧреЗ...
Install-Package Microsoft.Net.Http
Install-Package xUnit
public class SomeService
{
public async Task<string> GetSomeData(string url)
{
string result;
using (var httpClient = new HttpClient())
{
result = await httpClient.GetStringAsync(url);
}
return result;
}
}
public class Facts
{
[Fact]
public async Task GivenAValidUrl_GetSomeData_ReturnsSomeData()
{
// Arrange.
var service = new SomeService();
// Act.
var result = await service.GetSomeData("http://www.google.com");
// Assert.
Assert.True(result.Length > 0);
}
}
рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рд▓реЛрдЧ рд╣рдореЗрд╢рд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдврд╛рдВрдЪреЗ рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рджрд╕реНрдп рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдпрд╣ рдЯреВрдЯрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ред
рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ .NET Framework рдХреЗ рд╕рд╛рде рд╕реЛрдЪрдиреЗ рдХреЗ рдЗрд╕ рддрд░реАрдХреЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, .NET рдХреЛрд░ рдХрдИ рдЫреЛрдЯреЗ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗред рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╡рд░реНрдЬрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯрдХреНрдХрд░ рджреЗрдВ, рдФрд░ рдЖрдкрдХрд╛ рдХрд╛рдо рд╣реЛ рдЧрдпрд╛ред рдХреЗрд╡рд▓ рд╡рд╣реА рд▓реЛрдЧ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдВрдЧреЗ рдЬреЛ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдХреЛ рдирдП рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ - рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВред
рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреА рд╡рдХрд╛рд▓рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рд╣рд░ рджрд┐рди рд╣рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рддреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП: рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдПрдХ рдирдП рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рд╕рд╛рде рдмреИрдЪ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред
рдореБрдЭреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдиреБрдХреВрд▓рддрд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдПрдкреАрдЖрдИ рдХреЛ рдЕрдкрдВрдЧ рдХрд░рдирд╛ рджреБрдЦрдж рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ .NET рдХреЛрд░ рдХрд╛ рддреЗрдЬреА рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдирд╛ рд▓рдХреНрд╖реНрдп рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдкрдХреЛ рд╕реВрдХреНрд╖реНрдо .NET рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдЬрд╛рд░реЛрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ?
рдореЗрд░реЗ рджреЛ рд╕реЗрдВрдЯред
@MrJul : +1:
рд╡рд░реНрдЬрдирд┐рдВрдЧ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛рдПрдБ рдореМрдЬреВрдж рд╣реИрдВ :)
рд╡рд░реНрдЬрдирд┐рдВрдЧ рдЕрднреА рднреА рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдПрдХ рдореБрджреНрджрд╛ рд╣реИред рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдЬреЛ рдбреЗрд╕реНрдХрдЯреЙрдк рдореЗрдВ рдЗрдирдмреЙрдХреНрд╕ рд╣реИрдВ, рд╣рдо рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдо рдлреЛрд░реНрдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд▓реЛрдЧ рдкреЛрд░реНрдЯреЗрдмрд▓ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджреЛрдиреЛрдВ рдЬрдЧрд╣реЛрдВ рдкрд░ рдЪрд▓реЗрдЧрд╛ред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: https://github.com/dotnet/corefx/wiki/Breking-Changesред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдЪрд░реНрдЪрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдо рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рддрд░реНрдХ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЦрд░реЛрдВрдЪ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдЕрдЧрд▓реА рдбрд┐рдЬрд╝рд╛рдЗрди рдореАрдЯрд┐рдВрдЧ рдореЗрдВ рд▓рд╛рдиреЗ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ?
рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд░рд╣реА рдЯреЗрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЬреЛ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реБрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдХ рдирдХрд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреБрдЫ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдирдХрд▓реА рд╡рд╕реНрддреБ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛ рд╕рдХрддреА рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рддреЛ рдЖрдк рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░реЗрдВ рдФрд░ @SidharthNabar рдФрд░ рдЙрдирдХреА рдЯреАрдо рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреА рд╣реИред
рдпрджрд┐ рдПрдкреАрдЖрдИ рдирдХрд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реБрджреНрдз рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╕реЗ рдирдХрд▓реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред
@KrzysztofCwalina рдЖрдк, рд╕рд░, рд╕рд┐рд░ рдкрд░ рдХреАрд▓ рдареЛрдХреЗрдВ! рд╕рд╣реА рд╕рд╛рд░рд╛рдВрд╢!
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рддрд░реНрдХ рдХрд╛ рдХрдо рд▓реЛрдХрдкреНрд░рд┐рдп рдкрдХреНрд╖ рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, HttpClient
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдореВрд░реНрдд рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ HttpMessageHandler
рд╕реЗ рдЖрддрд╛ рд╣реИред рд╣рд╛рдВ, Moq рдпрд╛ FakeItEasy рдЬреИрд╕реЗ рдврд╛рдВрдЪреЗ рдХреЗ рдЖрджреА рд╣реЛ рдЪреБрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдирдХрд▓реА/рдирдХрд▓реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ _only_ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдкреАрдЖрдИ рдЕрднреА рднреА рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╣реИред
рддреЛ рдЪрд▓рд┐рдП "рдореБрдЭреЗ рдЕрдкрдирд╛ рдЦреБрдж HttpMessageHandler
рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?" рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдирд╣реА рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАред рд╣рдо рд╕рднреА рдиреЗ рдЕрдкрдиреА рдореЙрдХрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд╣реАрдВ рд▓рд┐рдЦреАред @PureKrome рдкрд╣рд▓реЗ рд╣реА рдЕрдкрдиреА HttpClient.Helpers рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджрд┐рдЦрд╛ рдЪреБрдХрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рджреЗрдЦ рд▓реВрдВрдЧрд╛ред рдореИрдВ @richardszalay рдХреА MockHttp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рд╢рд╛рдирджрд╛рд░ рд▓рдЧрддреА рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА AngularJS рдХреЗ $httpBackend рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ MockHttp рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рддрд░реАрдХрд╛ рдЕрдкрдирд╛ рд░рд╣рд╛ рд╣реИред
рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдкрдХреА рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдХреЛ HttpClient
рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░ рд╕рдХрддреА рд╣реИ new HttpClient()
ред рдпрджрд┐ рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ Func<HttpClient>
рд▓реЗрдВ рдпрд╛, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ Func<>
рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ IHttpClientFactory
рдЕрдореВрд░реНрдд рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдлрд┐рд░ рд╕реЗ, рдХреЗрд╡рд▓ new HttpClient()
рд▓реМрдЯрд╛рдПрдЧрд╛ред
рд╕рдорд╛рдкрди рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рдПрдкреАрдЖрдИ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рд░реВрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддрд╛рд░реНрдХрд┐рдХ, рд╕рд╣рдЬ рддрд░реАрдХреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреА рдЗрд╕ рднрд┐рдиреНрди рд╢реИрд▓реА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛/рд╕рд░рд▓рддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдЗрдП рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдВред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЗ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреЗред рд▓реЗрдХрд┐рди рдЪрд▓реЛ, perfectly testable
рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рд╣реИ :)
@luisrudge рдареАрдХ рд╣реИ рдХреНрдпрд╛ рдЖрдк рдПрдХ рдРрд╕рд╛ рдкрд░рд┐рджреГрд╢реНрдп рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреА рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ MockHttp рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝ рд╕рдХреНрд╖рдо рд╣реИ? рд╢рд╛рдпрдж рдЗрд╕рд╕реЗ рдорд╛рдорд▓рд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред
рдореБрдЭреЗ рдХреБрдЫ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрднреА рддрдХ рд╕рдВрд╣рд┐рддрд╛рдмрджреНрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдЧреВрдврд╝ рдкрд░рд┐рджреГрд╢реНрдп рдпрд╛рдж рдЖ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЙрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдПрдХ рдЧрд╛рдпрдм рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдпреЛрдЧрджрд╛рди рджреЗ рд╕рдХрддрд╛ рд╣реИред
рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд░рд╛рдп рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ "рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп" рд╣реИ, рдмрд╕ рдПрдХ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВред NET рджреЗрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╣реИ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдПрдХ рджрд░реНрдж рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА lib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИред
рдХреЛрдИ рддрд░реНрдХ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрд╕реНрдкрдиреЗрдЯ рдПрдорд╡реАрд╕реА 5 рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╣реИ, рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рд╣рд░ рдЪреАрдЬ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 50LOC рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЖрдИрдПрдордПрдЪрдУ, рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рдорд╛рдорд▓рд╛ рд╣реИред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╣реИ? рд╣рд╛рдВред рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ? рдирд╣реАрдВред
@luisrudge рд╣рд╛рдВ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИ рдФрд░ рдореИрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕/рд╡рд░реНрдЪреБрдЕрд▓ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВред рдореИрдВ рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЬреЛ рдХреЛрдИ рднреА рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдЙрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рддрдереНрдп рдкрд░ рдХреБрдЫ рд╢рд┐рдХреНрд╖рд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧреА рдХрд┐ рдпрд╣ рдПрдкреАрдЖрдИ _can be_ рдПрдХ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рддрд░реАрдХреЗ рд╕реЗ HttpClient
рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рд░ рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рд▓реАрд╡рд░реЗрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдЕрдЧрд░ рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА lib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ
рдареАрдХ рд╣реИ, рд╣рдо рд╕рднреА рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдордЬрд╛рдХ/рдирдХрд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ * рдФрд░, рдпрд╣ рд╕рдЪ рд╣реИ, рд╣рдо рдПрдкреАрдЖрдИ рдХреА рдЗрд╕ рд╢реИрд▓реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл _that_ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЗрд╕рд╕реЗ рдХрдо рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╣реИ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореБрдЭреЗ рдПрдХ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд╛рдирд╛ рд╣реИред
_ * рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ!_
рдореЗрд░реЗ рдУрдкреА рд╕реЗ @ drub0y рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд░реНрдж рд╣реИ (рдЬреЛ рдореИрдВ рдЬреБрдиреВрди рд╕реЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред IMO @luisrudge рдиреЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ:
рдХреЛрдИ рддрд░реНрдХ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрд╕реНрдкрдиреЗрдЯ рдПрдорд╡реАрд╕реА 5 рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╣реИ, рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рд╣рд░ рдЪреАрдЬ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 50LOC рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛
рдпрд╣ рд░реЗрдкреЛ _рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп) рд░рдгрдиреАрддрд┐ рдЗрд╕ рд░реЗрдкреЛ рдХреЗ рд╕рд╛рде _very_ рд╕рддрд░реНрдХ рд░рд╣рдирд╛ рд╣реИред рдЬрд╝рд░реВрд░ - рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдЧрдпрд╛ред
рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рд░реЗрдкреЛ рдЕрднреА рднреА рдЖрд░рдЯреАрдбрдмреНрд▓реНрдпреВ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (рдПрдкреАрдЖрдИ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ) рдЯреНрд╡реАрдХ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИред рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдЪрд╛рдирдХ _рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ_ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП _рдзрд╛рд░рдгрд╛_ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред
рддреЛ рд╡рд░реНрддрдорд╛рди рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде - рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╣рд╛рдВред рдХреНрдпрд╛ рдпрд╣ рдбрд╛рд░реНрдХ рдореИрдЯрд░ рдбреЗрд╡рд▓рдкрд░ рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ? рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ред
рд▓рд┐рдЯрдорд╕ рдЯреЗрд╕реНрдЯ рдЖрдИрдПрдордУ рдпрд╣ рд╣реИ: рдХреНрдпрд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рдЬреЛ рдкрд┐рдХрдЕрдк рдЖрдо/рд▓реЛрдХрдкреНрд░рд┐рдп рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ + рдореЙрдХрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдФрд░ рдЗрд╕ рдПрдкреАрдЖрдИ рдореЗрдВ рдХрд┐рд╕реА рднреА рдореБрдЦреНрдп рддрд░реАрдХреЗ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛ рд╕рдХрддрд╛ рд╣реИ? рдЕрднреА - рдирд╣реАрдВред рддреЛ рдлрд┐рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ _рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди_ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, HttpClient рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдореВрд░реНрдд рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ HttpMessageHandler рд╕реЗ рдЖрддрд╛ рд╣реИред
рдпрд╣ рдореЗрд░реА рдмрд╛рдд рд╣реИ - рдЖрдк рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдХрд┐рд▓ рдХреНрдпреЛрдВ рдЦрд░реНрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЙрд╕ рд╕рд╛рд░реЗ рдЬрд╛рджреВ рдХреЛ рдЕрдореВрд░реНрдд рдХрд░рдирд╛ рд╣реИ .. рдХреЗрд╡рд▓ "рдареАрдХ рд╣реИ .. рддреЛ рд╣рдордиреЗ рдХреБрдЫ рдЬрд╛рджреВ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдордЬрд╛рдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╣рдорд╛рд░рд╛ рдЬрд╛рджреВ ... рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЕрдм рдЖрдкрдХреЛ рдЕрдкрдиреА рдЖрд╕реНрддреАрди рдКрдкрд░ рдЦреАрдВрдЪрдиреА рд╣реЛрдЧреА, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЫрдд рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдВрджрд░ рдЦреБрджрд╛рдИ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЖрджрд┐"ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ ... рдЙрд▓рдЭрд╛ рд╣реБрдЖред
рд╣рдо рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдФрд░ рд░рдХреНрд╖рд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ: "рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди .. рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди/рдХреЛрдб рдкрдврд╝реЗрдВ"ред
рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдХреЛрдг рд╣реИ: рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЧреИрд░-рдПрдордПрд╕ рджреЗрд╡реЛрдВ рдХреЛ 2 рдЙрджрд╛рд╣рд░рдг рджреЗрдВ ... рдЬреЛ рдирд╛рдЧрд░рд┐рдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ xUnit рдФрд░ Moq/FakeItEasy/InsertTheHipMockingFrameworkThisYear рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдпрд╣ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЖрдИрдПрдордУред
рджреЗрдЦреЗрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдбреЗрд╡рд▓рдкрд░ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ _рдФрд░_ рдЦреБрд╢ рд░рд╣реЗрдВред
рдпрджрд┐ рдПрдкреАрдЖрдИ рдирдХрд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрднреА рдпрд╣ рдЖрдИрдПрдордУ рдирд╣реАрдВ рд╣реИ - рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ (рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛)
рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реБрджреНрдз рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╕реЗ рдирдХрд▓реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред
рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА - рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИред рд▓рдХреНрд╖реНрдп рдпреБрджреНрдз-рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдирдХрд▓реА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИ рдФрд░ рдЖрдк рдЬрд╛рддреЗ рд╣реИрдВред
@luisrudge рдЕрдЧрд░ рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА lib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ
@ drub0y рдареАрдХ рд╣реИ, рд╣рдо рд╕рднреА рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдордЬрд╛рдХ/рдирдХрд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ
(рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЕрдВрддрд┐рдо рдЙрджреНрдзрд░рдг/рдкреИрд░рд╛рдЧреНрд░рд╛рдл ..) рдирд╣реАрдВ ... рд╢рд╛рдВрддред @luisrudge рдХреНрдпрд╛ рдХрд╣ рд░рд╣рд╛ рдерд╛: "рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред рдордЬрд╛рдХ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдЙрдкрдХрд░рдгред рдЕрдм рддрдХ, рд╡реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп/рд╕рдордЧреНрд░ рдЙрдкрдХрд░рдг рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди .. рдЕрдм рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдПрдХ рддреАрд╕рд░рд╛ рдЯреВрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВрдВ рдЬреЛ _specific_ рд╣реИред рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдПрдХ _specific_ API/рд╕реЗрд╡рд╛ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬрд┐рд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ API/рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?"ред рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рдореГрджреНрдз рд╣реИ :(
рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдкрдХреА рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдХреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЗрдВрдЬреЗрдХреНрд╢рди рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирдП рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ() рдХреЗ рдЙрдЪрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд! рддреЛ, рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдирдореВрдирд╛ рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП/рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдмрд┐рд▓реНрд▓реА рдХреА рдЦрд╛рд▓ рдЙрддрд╛рд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ ... рддреЛ рдПрдХ рд╕рд░рд▓ рдФрд░ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ? рд╣рдореЗрдВ рдХреЛрдб рджрд┐рдЦрд╛рдПрдВред
рдореИрдВ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @KrzysztofCwalina рд╕реЗ рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд▓рд┐рдЯрдорд╕ рдЯреЗрд╕реНрдЯ рдХреЛ рдХрд┐рдХрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
public interface IHttpClient
{
Task<string> GetStringAsync(string url);
}
public class SomeService
{
private IHttpClient _httpClient;
// Injected.
public SomeService(IHttpClient httpClient) { .. }
public async Task<string> GetSomeData(string url)
{
string result;
using (var httpClient = _httpClient ?? new HttpClient())
{
result = await httpClient.GetStringAsync(url);
}
return result;
}
}
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА @PureKrome рдХреА рдЬрд░реВрд░рдд рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЕрдкрдбреЗрдЯ рд╣реИ рдЬреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдПрдкреАрдЖрдИ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдирдХрд▓/рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реИред
@ рд╢рд╛рд░рд╡реЗрд▓ рдмрд┐рд▓реНрдХреБрд▓ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЬрдм рдореИрдВ рд╕рд╛рдорд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╕рдВрдкреВрд░реНрдг httpclient рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛:
SendAsync рд╡рд┐рдзрд┐ рджреЗрдЦреЗрдВред
рдпрд╣ рдкрд╛рдЧрд▓ рд╣реИред рдЖрдк рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХрдХреНрд╖рд╛ рд╕реЗ рдЖрдВрддрд░рд┐рдХ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреАрдердм рдЦреЛрд▓реЗрдВ, рдХреЛрдб рджреЗрдЦреЗрдВ рдФрд░ рдЙрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣ рдбреЗрд╡рд▓рдкрд░ GetStringAsync
рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдП рдФрд░ рдмрдХрд╡рд╛рд╕ рдХрд░реЗред
@luisrudge рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдордЬрд╛рдХ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рд╛рдл рдЕрдореВрд░реНрдд рдкрд░рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдбрд┐рдХреВрдкреНрдб, рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдпреЛрдЧреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдХрд┐рдВрдЧ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЙрдкрд╣рд╛рд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:
Dispose
рдкрд░ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЙрдХ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрдВрдЧреЗ)HttpClient
рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рд╕реЗ рдЬреБрдбрд╝реА рд╡рд┐рдХрд╛рд╕ рд▓рд╛рдЧрдд рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИрдореЙрдХрд┐рдВрдЧ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд░рдгрдиреАрддрд┐ рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЬреБрдбрд╝реЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЫреЛрдЯреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдореЙрдХрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ рд▓рд╛рдЧрдд рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рд░рдЦрддрд╛ рд╣реИ, рдореЙрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП _need_ рдХреЛрдб рдореЗрдВ рдпреБрдЧреНрдорди рдХреА рдмрдврд╝реА рд╣реБрдИ рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рд░рдЦрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЦреБрдж рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдПрдХ рдХреЛрдб рдЧрдВрдз рд╣реИред рдпрджрд┐ рдЖрдк рдореЙрдХрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рднреАрддрд░ рдФрд░ рднреАрддрд░ рд╕рдорд╛рди рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкрд░реАрдХреНрд╖рдг рдХрд╡рд░реЗрдЬ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рд░ рд╡рд┐рдХрд╛рд╕ рдкрд╣рд▓реВ рдореЗрдВ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗред
рдЪреВрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рд╛рдл рдЕрдореВрд░реНрдд рдкрд░рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдбрд┐рдХреВрдкреНрдб, рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдпреЛрдЧреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдХрд┐рдВрдЧ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ
рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде, рдпрджрд┐ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдлреЗрдХ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЬреЛ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрджреЗ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪреНрдЪ рдмрд╛рдзрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред
рдореИрдВ рдкрд╣рд▓реЗ @luisrudge рдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред _рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ_ MVC5 рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдерд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рднрдЧрд╡рд╛рди рдпрд╣ рдЧрдзреЗ рдореЗрдВ рджрд░реНрдж рдерд╛ рдФрд░ рдмрд╛рд▓реЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕реНрд░реЛрдд рдерд╛ред
@sharwell рдХреНрдпрд╛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ IHttpClient
рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдПрдХ рдмреЛрдЭ рд╣реИ рдФрд░ рдПрдХ рдирдХрд▓реА рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ (рдЬреИрд╕реЗ рдпрд╣ рдирд╣реАрдВ рд╣реИ? рдореИрдВ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред
@luisrudge рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП GetStringAsync
, рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдЗрддрдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реИред рдЖрдЙрдЯ-рдСрдл-рдж-рдмреЙрдХреНрд╕ Moq + HttpClient рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдЪрд╛рд╣рд┐рдП:
Uri requestUri = new Uri("http://google.com");
string expectedResponse = "Response text";
Mock<HttpClientHandler> mockHandler = new Mock<HttpClientHandler>();
mockHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.Is<HttpRequestMessage>(message => message.RequestUri == requestUri), ItExpr.IsAny<CancellationToken>())
.Returns(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(expectedResponse) }));
HttpClient httpClient = new HttpClient(mockHandler.Object);
string result = await httpClient.GetStringAsync(requestUri).ConfigureAwait(false);
Assert.AreEqual(expectedResponse, result);
рдпрджрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
internal static class MockHttpClientHandlerExtensions
{
public static void SetupGetStringAsync(this Mock<HttpClientHandler> mockHandler, Uri requestUri, string response)
{
mockHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.Is<HttpRequestMessage>(message => message.RequestUri == requestUri), ItExpr.IsAny<CancellationToken>())
.Returns(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(response) }));
}
}
рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
Uri requestUri = new Uri("http://google.com");
string expectedResponse = "Response text";
Mock<HttpClientHandler> mockHandler = new Mock<HttpClientHandler>();
mockHandler.SetupGetStringAsync(requestUri, expectedResponse);
HttpClient httpClient = new HttpClient(mockHandler.Object);
string result = await httpClient.GetStringAsync(requestUri).ConfigureAwait(false);
Assert.AreEqual(expectedResponse, result);
рддреЛ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
_рдЕрд╕реНрд╡реАрдХрд░рдг_: рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛрдбред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдЙрдореНрд░ рдореЗрдВ Moq рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
public class SomeService(HttpClientHandler httpClientHandler= null)
{
public async Foo GetSomethingFromTheInternetAsync()
{
....
using (var httpClient = _handler == null
? new HttpClient
: new HttpClient(handler))
{
html = await httpClient.GetStringAsync("http://www.google.com.au");
}
....
}
}
// Unit test...
// Arrange.
Uri requestUri = new Uri("http://google.com");
string expectedResponse = "Response text";
var responseMessage = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(expectedResponse) };
Mock<HttpClientHandler> mockHandler = new Mock<HttpClientHandler>();
mockHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.Is<HttpRequestMessage>(message => message.RequestUri == requestUri), ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(responseMessage);
HttpClient httpClient = new HttpClient(mockHandler.Object);
var someService = new SomeService(mockHandler.Object); // Injected...
// Act.
string result = await someService.GetSomethingFromTheInternetAsync();
// Assert.
Assert.AreEqual(expectedResponse, result);
httpClient.Verify(x => x.GetSomethingFromTheInternetAsync(), Times.Once);
рдмрдирд╛рдо рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рдХреЛ рд╕реАрдзреЗ рдирдХрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред
public class SomeService(IHttpClient httpClient = null)
{
public async Foo GetSomethingFromTheInternetAsync()
{
....
using (var httpClient = _httpClient ?? new HttpClient())
{
html = await httpClient.GetStringAsync("http://www.google.com.au");
}
....
}
}
// Unit tests...
// Arrange.
var response = new Foo();
var httpClient = new Mock<IHttpClient>();
httpClient.Setup(x => x.GetStringAsync(It.IsAny<string>))
.ReturnsAsync(response);
var service = new SomeService(httpClient.Object); // Injected.
// Act.
var result = await service.GetSomethingFromTheInternetAsync();
// Assert.
Assert.Equals("something", foo.Something);
httpClient.Verify(x => x.GetStringAsync(It.IsAny<string>()), Times.Once);
рдЗрд╕реЗ рдХрдо рдХрд░рдХреЗ, рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░ рдЖрддрд╛ рд╣реИ ( SomeService
рдореЗрдВ рдорд╛рдореВрд▓реА рдЕрдВрддрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░) ...
var responseMessage = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(expectedResponse) };
Mock<HttpClientHandler> mockHandler = new Mock<HttpClientHandler>();
mockHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.Is<HttpRequestMessage>(message => message.RequestUri == requestUri), ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(responseMessage);
HttpClient httpClient = new HttpClient(mockHandler.Object);
рдпрд╣ рдмрдирд╛рдо ...
var httpClient = new Mock<IHttpClient>();
httpClient.Setup(x => x.GetStringAsync(It.IsAny<string>))
.ReturnsAsync(response);
рдХреНрдпрд╛ рдХреЛрдб _рдореЛрдЯреЗ рддреМрд░ рдкрд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ? (рджреЛрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛрдиреЛрдВ рдХреЛ рдХрд╛рдлреА рд╕рдЯреАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред
@sharwell рддреЛ рдореБрдЭреЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА HttpClient.cs рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рдХреЛрдб рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛? рдпрд╣ рдХрдо рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ?
рд╣рдо рдЕрдкрдиреЗ рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдореЛрдВ рдореЗрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЗрд╕реЗ рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдЪреНрдЫрд╛ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдЯреБрдХрдбрд╝рд╛ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд╕рдВрдж рд╣реИ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рд╕реБрдзрд╛рд░ рдЖрдИрдПрдордУ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред
рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдХреВрдбреЛ рд╕реЗ @PureKrome , рд▓реЗрдХрд┐рди рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛ :)
рдореИрдВрдиреЗ рдЕрднреА рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдкрдврд╝реА рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ: рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ HttpClient
рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рд╡рд░реНрдЧ рдЬреИрд╕реЗ HtmlDownloader.DownloadFile()
рдореЗрдВ рд▓рдкреЗрдЯреА рдЬрд╛рдПрдЧреАред рдкреНрд▓рдВрдмрд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдордЬрд╛рдХ рдХреНрдпреЛрдВ рди рдЙрдбрд╝рд╛рдПрдВ?
рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдореЙрдХрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрдм рдЖрдкрдХреЛ рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХреЛрдб рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА, рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рдкрд╛рд░реНрд╕рд┐рдВрдЧ) рдХреЛ рдХрдХреНрд╖рд╛/рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдирдХрд▓реА рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреА рдЯреЗрд╕реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдореЗрдВ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рди рд╣реА рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдмрд╕ рдХреБрдЫ рдирдИ рдЪреАрдЬреЗрдВ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
@tucaz рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд▓реМрдЯрд╛рддреА рд╣реИред рдЖрдкрдХреА рдЙрдореНрд░, рдирд╛рдо, рдЬрдиреНрдорджрд┐рди рдЗрддреНрдпрд╛рджрд┐ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдХрдВрдкрдирд┐рдпреЛрдВ рдореЗрдВ рд╕реНрдЯреЙрдХ рднреА рд╣реЛрддрд╛ рд╣реИред
рдЖрдкрдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдПрдП рд╕реНрдЯреЙрдХ рдХреА 100 рдЗрдХрд╛рдЗрдпрд╛рдВ рдФрд░ рдмреАрдмреАрдмреА рд╕реНрдЯреЙрдХ рдХреА 200 рдЗрдХрд╛рдЗрдпрд╛рдВ рд╣реИрдВ? рдЗрд╕рд▓рд┐рдП, рдЬрдм рд╣рдо рдЖрдкрдХреЗ рдЦрд╛рддреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕реНрдЯреЙрдХ рдХреА рдХреАрдордд рдХрд┐рддрдиреА рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ _another_ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдореМрдЬреВрджрд╛ рд╕реНрдЯреЙрдХ рдХреА рдХреАрдорддреЛрдВ рдХреЛ рд╣рдерд┐рдпрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рддреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрдЯреЙрдХ рдХреЛ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдЗрд╕ рдХрд░рдиреЗ рджреЛ...
_рдЕрд╕реНрд╡реАрдХрд░рдг: рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛрдб..._
public class StockService : IStockService
{
private readonly IHttpClient _httpClient;
public StockService(IHttpClient httpClient)
{
_httpClient = httpClient; // Optional.
}
public async Task<IEnumerable<StockResults>> GetStocksAsync(IEnumerable<string> stockCodes)
{
var queryString = ConvertStockCodeListIntoQuerystring();
string jsonResult;
using (var httpClient = _httpClient ?? new HttpClient())
{
jsonResult = await httpClient.GetStringAsync("http:\\www.stocksOnline.com\stockResults?" + queryString);
}
return JsonConvert.DeserializeObject<StockResult>(jsonResult);
}
}
рдареАрдХ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рд▓ рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдХрд╣рддреА рд╣реИ: "_рдЧреЛ рдореБрдЭреЗ рд╕реНрдЯреЙрдХ рдПрдПрдП рдФрд░ рдмреАрдмреАрдмреА_ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЙрдХ рдХреА рдХреАрдорддреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ";
рддреЛ, рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ:
рдФрд░ рдЕрдм рдореИрдВ рдЙрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЬрдм httpClient рдЙрдбрд╝рд╛рддрд╛ рд╣реИ (рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ) .. рдпрд╣ рд╕реЗрд╡рд╛ рдЪрд▓ рд░рд╣реА рд╣реИ .. рддреЛ рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рд▓реЙрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдбреЛрдиреЛ .. рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВред
рдмреЗрд╢рдХ - рдореИрдВ рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди 100% рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЛ рд╣рд┐рдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдирдХрд▓реА рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рдЧрд╛рдХрд░, рдореИрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдиреНрдпрдерд╛ рдореИрдВ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рддреЛ рдореИрдВ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рдПрдХ рдирд░рдХрд╡рд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ (рдкрдврд╝рдиреЗ/рдмрдирд╛рдП рд░рдЦрдиреЗ/рдЖрджрд┐) рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ред
рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ HttpClient рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╡рд░реНрдЧ рдЬреИрд╕реЗ HtmlDownloader.DownloadFile() рдореЗрдВ рд▓рдкреЗрдЯреА рдЬрд╛рдПрдЧреАред
рд╣рдореЗрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреНрдпреЛрдВ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ _рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА http :sparkles: рдиреАрдЪреЗ рдПрдХ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рд╣реИред рдпрд╣ рдПрдХ рдорд╣рд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ! рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рд╣реЛрдЧрд╛?
@PureKrome рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдареАрдХ рд╡рд╣реА рд╣реИ рдЬреЛ рдПрдХ рд░реИрдкрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рдкреЗрдЯрдХрд░ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд webservice рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрдм рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЛрд░ рджреЗрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЬреЛ рдХреЛрдИ рднреА рдЙрдкрднреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ GetStockAsync
рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛
рдХреГрдкрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
private IStockService stockService;
[Setup]
public void Setup()
{
stockService = A.Fake<IStockService>();
A.CallTo(() => stockService.GetStocksAsync(new [] { "Ticker1" }))
.Returns(new StockResults[] { new StockResults { Price = 100m, Ticker = "Ticker1", Status = "OK" }});
A.CallTo(() => stockService.GetStocksAsync(new [] { "Ticker2" }))
.Returns(new StockResults[] { new StockResults { Price = 0m, Ticker = "Ticker2", Status = "NotFound" }});
A.CallTo(() => stockService.GetStocksAsync(new [] { "Ticker3" }))
.Throws(() => new InvalidOperationException("Some weird message"));
}
[Test]
public async void Get_Total_Stock_Quotes()
{
var stockService = A.Fake<IStockService>();
var total = await stockService.GetStockAsync(new [] { "Ticker1" });
Assert.IsNotNull(total);
Assert.IsGreaterThan(0, total.Sum(x => x.Price);
}
[Test]
public async void Hints_When_Ticker_Not_Found()
{
var stockService = A.Fake<IStockService>();
var total = await stockService.GetStockAsync(new [] { "Ticker2" });
Assert.IsNotNull(total);
Assert.AnyIs(x => x.Status == "NotFound");
}
[Test]
public async void Throws_InvalidOperationException_When_Error()
{
var stockService = A.Fake<IStockService>();
Assert.Throws(() => await stockService.GetStockAsync(new [] { "Ticker3" }), typeof(InvalidOperationException));
}
рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдХреЛ рдПрдХ рд╕реНрддрд░ рдКрдкрд░ рдмрдврд╝рд╛рдПрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╕реЗ рдирд┐рдкрдЯреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ GetStockAsync
рдкрджреНрдзрддрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред
рдПрдХрдорд╛рддреНрд░ рдкрд░рд┐рджреГрд╢реНрдп рдЬрд┐рд╕реЗ рдореИрдВ HttpClient
рдХрд╛ рдордЬрд╛рдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрдм рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдЙрд╕рдХреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рддрд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЛрдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдЬрд┐рд╕реЗ рд╕рдВрднрд╡рддрдГ HttpClientWithRetryLogic
рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ HttpClient
рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдирд╣реАрдВ рдлреИрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдЗрд╕ рд╕рднреА рдкреБрдирд░реНрдкреНрд░рдпрд╛рд╕ рддрд░реНрдХ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ HttpClient
рдЙрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИред
@tucaz рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрднреА рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдирдХрд▓реА рд░рд┐рдЯрд░реНрди рдЬреЛ рдЖрдкрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рд╣реИрдВ, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдореЙрдХрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ? @PureKrome рдареЛрд╕ StockService
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред
$#$2 StockService
рдХрд╛ рдареАрдХ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдирдП рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рд╕реНрддрд░ рдХреЛ HttpClient
рдХреЙрд▓ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд░реИрдкрд░ рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЛ HttpClient
рдкрд░ рд╕реМрдВрдк рджреЗрдЧрд╛, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рдЧреИрд░-рдирдХрд▓реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╣рдореЗрд╢рд╛ рдЕрдореВрд░реНрддрддрд╛ рдХреА рдПрдХ рдирдИ рдкрд░рдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЬрд┐рд╕ рдЪреАрдЬ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЧрдИ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ HttpClient
рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рдд: рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@MrJul рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдЙрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рд╕реНрд╡рдпрдВ webservice рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдХреНрдпреЛрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ (рдмрд┐рдирд╛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗред рдореЗрд░рд╛ рдмреБрд░рд╛) рдХрд┐ рд╡рд╣ IStockService
рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рджрд╛рд╡рд╛ рдХрд░ рд╕рдХреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╕рдХреНрд╖рдо рд╣реИ рдЬреЛ рдХреБрдЫ рднреА GetStockAsync
рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЙрд╕реЗ рд╕рдВрднрд╛рд▓ рд▓реЗрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирдХрд▓реА рдврд╛рдВрдЪрд╛ рдирд╣реАрдВ (рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд┐рдпрд╛) рдпрд╛ webservice рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдЬреИрд╕реЗ @PureKrome рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ)ред
рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ IHttpClient
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдИрдПрдордУ рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдХреЛрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рджреЗрдЦрдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рдЕрдореВрд░реНрдд рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ рдХреИрд╕реЗ рд╣реИрдВ (рдФрд░ рдЗрд╕рд▓рд┐рдП webservice) рдЗрд╕рдХреА рд╡рд╛рдкрд╕реА рдХреЛ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред
@tucaz рдирд╣реАрдВ ред рдЖрдкрдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЧрд▓рдд рд╣реИред рдЖрдк рдореЙрдХрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред @PureKrome рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдИ рддреАрди рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛:
METHOD
. рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИURL
. рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдореЗрдВ рд╕рд┐рд░реНрдл IStockService
рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рддреАрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
@luisrudge рдЖрдкрдХреА рд╕рднреА рдмрд╛рддреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реИрдВред рд▓реЗрдХрд┐рди ... рдХреНрдпрд╛ рдЗрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЙрди рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реВрдВ рдЬреЛ рдХрдИ рдврд╛рдВрдЪреЗ (json.net, httpclient, рдЖрджрд┐) рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЖрдЬ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЙрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВред
рдлрд┐рд░ рднреА, рдЕрдЧрд░ рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХреБрдЫ рдЕрдЬреАрдм рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ deserialize рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдХреНрдпрд╛ рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрджрд░ HttpClient
рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХреЗ рдЙрди рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛? рд╕рд╛рде рд╣реА, рдпрд╣ рд░реЛрдХрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рд╣рд░ рд╕рдордп рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬреЗрдЧрд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдРрд╕реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рд╡реИрд╕реЗ рднреА рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реЛрдВрдЧреАред
рдореЗрд░реА рд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрдирдХрд╛ рдиреНрдпреВрдирддрдо рдирд┐рд╡рд▓ рдореВрд▓реНрдп рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рддрднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХрд╛ рдЕрдиреНрдп 99% рд╢рд╛рдорд┐рд▓ рд╣реЛред рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдпрд╣ рд╕рдм рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд╕рдВрдж рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╡рд┐рд╖рдп рд╣реИ рдЬрд╣рд╛рдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореВрд▓реНрдп рджреЗрдЦрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ HttpClient
рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдЗрди рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рднрд▓реЗ рд╣реА рдпрд╣ рдЗрд╖реНрдЯрддрдо рдкрд░рд┐рдгрд╛рдо рди рд╣реЛ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдм рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рд▓рд╛рдЧрдд рд╕рдВрднрд╛рд╡рд┐рдд рд▓рд╛рднреЛрдВ рд╕реЗ рдХрдо рд╣реЛрдЧреАред
рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдмрд╛рдд рдХреА рдереА рддреЛ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЬреЛ рдЙрджреНрджреЗрд╢реНрдп рдерд╛, рд╡рд╣ @PureKrome рдХреЛ рдЕрдкрдиреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдерд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдХрдо рдореВрд▓реНрдп рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░, рдпрд╣ рд╕рдм рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рдкрд░ рдЖрддрд╛ рд╣реИред
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдиреЗ рд╕рд╣реА url рдорд╛рд░рд╛ рд╣реИ, рдЖрдкрдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╢реБрджреНрдз рдореВрд▓реНрдп рд╣реИ? рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдкреЛрд╕реНрдЯ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрд╕рд╛рдзрди рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдЯ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ? рдореЗрд░реЗ рдЕрдиреНрдп 99% рдРрдк рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдХреЙрд▓ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдмрд╣реБрдд, рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ HttpClient::GetStringAsync
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ HttpClient
рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЦрд░рд╛рдм рддрд░реАрдХрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА HttpClient::Get[String|Stream|ByteArray]Async
рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдЦреЛ рдЪреБрдХреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХреЛрдИ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдПрдХ HttpRequestException
рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ рдЬрд┐рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ 'HTTP рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдЬреИрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рднреА рдЙрдЬрд╛рдЧрд░ рди рдХрд░реЗрдВред рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдиреЗ HttpClient
рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЬреЛ рднреА рдЕрдореВрд░реНрддрддрд╛ рдмрдирд╛рдИ рд╣реИ, рдЙрд╕рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ HTTP рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдбреЛрдореЗрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рд▓реАрдХреА рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ ... рдФрд░ рдПрдХ рдЬреЛ рдЖрдкрдХреА рдбреЛрдореЗрди рд╕реЗрд╡рд╛ рдХреЗ рдХреЙрд▓рд░реНрд╕ рдХреЛ рднрдпрд╛рдирдХ рдЕрдкрд╡рд╛рдж рдЬрд╛рдирдХрд╛рд░реА рдХрдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдирдХрд▓реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ рддреЛ рдЖрдк HttpClient
рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдЬреЛ $#$6 HttpResponseMessage
рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрддрд╛ рд╣реИ HttpMessageHandler::SendAsync
рдХрд╛ рдирдХрд▓реА/рдирдХрд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддрдиреА рд╣реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ! рдЖрдкрдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ HttpMessageHandler рд╕реНрддрд░ рдкрд░ рдХреЗрд╡рд▓ SendAsync
рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп HttpClient
HttpMessageHandler
рдкрд░ рдХрдИ рддрд░реАрдХреЛрдВ (рдЬреИрд╕реЗ [Get|Put|Delete|Send]Async
) рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ред
@luisrudge рдиреЗ JSON рдХреЛ deserializing рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо HttpContent
рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЙрди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ HttpResponseMessage
рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЬрдм рддрдХ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╕рдВрдкреВрд░реНрдг рдореАрдбрд┐рдпрд╛ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ GetStringAsync
рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ JsonSerializer::Deserialize
рдпрд╛ рдЬреЛ рднреА рд╣реЛред рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ _testing_ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╕рд┐рд░реНрдл рдПрдкреАрдЖрдИ _рдЦреБрдж_ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред :рдирд┐рд░рд╛рд╢:
@luisrudge рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИ, рдЖрдкрдХреЛ HttpClient
рдХреЛ рдЫреВрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЬрд┐рд╕ рд╕реНрд░реЛрдд рд╕реЗ рдЖрдкрдиреЗ URL рдкрдврд╝рд╛ рд╣реИ, рд╡рд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪреАрдЬреЗрдВ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдк рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╣реИрдВред рдлрд┐рд░, рдЗрд╕рдореЗрдВ HttpClient
рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХреЗ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╣реЛрддреА рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд╣реАрдВ рдФрд░ рд▓реАрдХ рдкрд╛рдЗрдк рди рд╣реЛред
@tucaz рд╕рд╣рдордд рд╣реИрдВред рдлрд┐рд░ рднреА: рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ :)
@ drub0y рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИ :)
@luisrudge рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрди "рд╕реБрд╡рд┐рдзрд╛" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдХреЗ рдордЬрд╛рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдбрд┐рдВрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рдЙрдкрдЪрд╛рд░рд╛рддреНрдордХ (рдЬреИрд╕реЗ рдпреВрдЯрд┐рд▓рд┐рдЯреА рдРрдкреНрд╕ рдФрд░ рд╕реНрдЯреЗрдЬ рдбреЗрдореЛ)ред рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреА рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдирдХреА рдХрдорд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реБрдП рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдлрд┐рд░ рднреА, рдЖрдЗрдП рд╣рдо рдЙрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдЬреЛ @PureKrome рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ HttpClient
API рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рд╛рде рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╡реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдбреЛрдореЗрди рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдбреЛрдореЗрди рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HTTP рдХреЙрд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИ:
``` рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ISomeDomainService
{
рдЯрд╛рд╕реНрдХ
}
рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ SomeDomainService: ISomeDomainService
{
рдирд┐рдЬреА рдкрдардиреАрдп HttpClient _httpClient;
public SomeDomainService() : this(new HttpClient())
{
}
public SomeDomainService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<string> GetSomeThingsValueAsync(string id)
{
return await _httpClient.GetStringAsync("/things/" + Uri.EscapeUriString(id));
}
}
As you can see, it allows an `HttpClient` instance to be injected and also has a default constructor that instantiates the default `HttpClient` with no other special settings (obviously this default instance can be customized, but I'll leave that out for brevity).
Ok, so what's a test method look like for this thing using the MockHttp library then? Let's see:
``` c#
[Fact]
public async Task GettingSomeThingsValueReturnsExpectedValue()
{
// Arrange
var mockHttpMessageHandler = new MockHttpMessageHandler();
mockHttpMessageHandler.Expect("http://unittest/things/123")
.Respond(new StringContent("expected value"));
SomeDomainService sut = new SomeDomainService(new HttpClient(mockHttpMessageHandler)
{
BaseAddress = new Uri("http://unittest")
});
// Act
var value = await sut.GetSomeThingsValueAsync("123");
// Assert
value.Should().Be("expected value");
}
рдЕрд░реЗ, рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рдФрд░ рд╕реАрдзрд╛ рд╣реИ; рджрд┐рди IMNSHO рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдкрдврд╝рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ FluentAssertions рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдПрдХ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ "рдореИрдВ рдПрдХ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛" рддрд░реНрдХ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдФрд░ рд╣рдбрд╝рддрд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВред
рдЕрдм, рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдХрднреА рднреА _really_ GetStringAsync
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред SomeDomainService::GetSomeThingsValueAsync
рд╡рд┐рдзрд┐ рдкрд░ рд╡рд╛рдкрд╕ рджреЗрдЦреЗрдВ рдФрд░ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЖрд░рдИрдПрд╕рдЯреА рдПрдкреАрдЖрдИ рдХрд╣ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рд░реНрдердХ HTTP рд╕реНрдерд┐рддрд┐ рдХреЛрдб рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ "123" рдХреА рдЖрдИрдбреА рд╡рд╛рд▓реА рдХреЛрдИ "рдЪреАрдЬрд╝" рдореМрдЬреВрдж рди рд╣реЛ рдФрд░ рдЗрд╕рд▓рд┐рдП API 404 рд╕реНрдерд┐рддрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЛрдореЗрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
``` рд╕реА#
// рдХреНрд░рдорд╛рдВрдХрди рд╕рдорд░реНрдерди рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ SomeThingDoesntExistException: рдЕрдкрд╡рд╛рдж:
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ SomeThingDoesntExistException (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрдИрдбреА)
{
рдЖрдИрдбреА = рдЖрдИрдбреА;
}
public string Id
{
get;
private set;
}
}
Ok, so let's rewrite the `SomeDomainService::GetSomeThingsValueAsync` method to do that now:
``` c#
public async Task<string> GetSomeThingsValueAsync(string id)
{
try
{
return await _httpClient.GetStringAsync("/things/" + Uri.EscapeUriString(id));
}
catch(HttpRequestException requestException)
{
// uh, oh... no way to tell if it doesn't exist (404) or server maybe just errored (500)
}
}
рддреЛ рдореИрдВ рдпрд╣реА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ GetStringAsync
рдЬреИрд╕реА рдмреБрдирд┐рдпрд╛рджреА "рд╕реБрд╡рд┐рдзрд╛" рд╡рд┐рдзрд┐рдпрд╛рдВ рдЙрддреНрдкрд╛рджрди рд╕реНрддрд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдЕрдЪреНрдЫреЗ" рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рдХреЗрд╡рд▓ HttpRequestException
рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рдХрд┐ рдЖрдкрдХреЛ рдХреМрди рд╕рд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рдХрд┐рд╕реА рдбреЛрдореЗрди рдХреЗ рднреАрддрд░ рд╕рд╣реА рдЕрдкрд╡рд╛рдж рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ GetAsync
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ HttpResponseMessage
рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░рдиреА рд╣реЛрдЧреА:
``` рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ async рдХрд╛рд░реНрдп
{
HttpResponseMessage responseMessage = рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ _httpClient.GetAsync("/things/" + Uri.EscapeUriString(id));
if(responseMessage.IsSuccessStatusCode)
{
return await responseMessage.Content.ReadAsStringAsync();
}
else
{
switch(responseMessage.StatusCode)
{
case HttpStatusCode.NotFound:
throw new SomeThingDoesntExistException(id);
// any other cases you want to might want to handle specifically for your domain
default:
// Unhandled cases can throw domain specific lower level communication exceptions
throw new HttpCommunicationException(responseMessage.StatusCode, responseMessage.ReasonPhrase);
}
}
}
Ok, so now let's write a test to validate that I get my domain specific exception when I request a URL that doesn't exist:
``` C#
[Fact]
public void GettingSomeThingsValueForIdThatDoesntExistThrowsExpectedException()
{
// Arrange
var mockHttpMessageHandler = new MockHttpMessageHandler();
SomeDomainService sut = new SomeDomainService(new HttpClient(mockHttpMessageHandler)
{
BaseAddress = new Uri("http://unittest")
});
// Act
Func<Task> action = async () => await sut.GetSomeThingsValueAsync("SomeIdThatDoesntExist");
// Assert
action.ShouldThrow<SomeThingDoesntExistException>();
}
Ermahgerd рдпрд╣ рдФрд░ рднреА рдХрдо рдХреЛрдб рд╣реИ !!$!% рдХреНрдпреЛрдВ? 'рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ MockHttp рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА рдФрд░ рдЗрд╕рдиреЗ рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд URL рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ 404 рд▓реМрдЯрд╛ рджрд┐рдпрд╛ред
@PureKrome рдиреЗ рдПрдХ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рд╡рд╣ рдПрдХ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдХреЗ рднреАрддрд░ рд╕реЗ рдирдП HttpClient
рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдЦреБрдж рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ Func<HttpClient>
рд▓реЗрдВрдЧреЗ рдпрд╛ рдпрджрд┐ рдЖрдк Func
рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдлрд╝реИрдХреНрдЯрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЙрддреНрддрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ - рдореИрдВ @drub0y рдХреЗ рдЙрддреНрддрд░ рдФрд░ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
@ drub0y рдЖрдк рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ MockHttpMessageHandler
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣реА рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рд╣реИред рдпрд╣ рдХрд╛рдлреА рд╕реАрдзреЗ рдЖрдЧреЗ рдирд╣реАрдВ рд╣реИред рдПрд╕реНрдкрдиреЗрдЯ 5 рдХреЗ рд╕рд╛рде, рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреАрдЖрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЕрд▓рдЧ, рдХрдо рдЦреЛрдЬ рдпреЛрдЧреНрдп рдФрд░ рдХрдо рд╕рд╣рдЬ рд╣реИред
@luisrudge рдЬрд╝рд░реВрд░, рдореИрдВ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдХрднреА рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рд╣рдореЗрдВ Moq рдпрд╛ FakeItEasy рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╣рдордиреЗ рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рд╣рдореЗрдВ N/XUnit, FluentAssertions, рдЖрджрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рднрд┐рдиреНрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред
рд╡рд╣рд╛рдБ рд╕рдореБрджрд╛рдп рдореЗрдВ рдорд╣рд╛рди (рд╕реНрдорд╛рд░реНрдЯ) рд▓реЛрдЧ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕рд╛рдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкрд╣рдЪрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд▓реЗрддреЗ рд╣реИрдВред (рдЙрди рд╕рднреА рдХреЛ рдкреНрд░рдгрд╛рдо!) рддрдм рд╕рдорд╛рдзрд╛рди рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдЕрдЪреНрдЫреЗ" рд╣реЛрддреЗ рд╣реИрдВ, рдЙрди рдкрд░ рджреВрд╕рд░реЛрдВ рдХрд╛ рдзреНрдпрд╛рди рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рди рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рд╕рдореБрджрд╛рдп рдХреЗ рдЕрдиреНрдп рдиреЗрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдУрдПрд╕рдПрд╕ рдФрд░ рд╕реБрд╕рдорд╛рдЪрд╛рд░ рдкреНрд░рдЪрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣реАрдВ рдмреЗрд╣рддрд░ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдУрдПрд╕рдПрд╕ рдХреА рд╢рдХреНрддрд┐ рдЕрдВрддрддрдГ .NET рд╕рдореБрджрд╛рдп рдореЗрдВ рдорд╣рд╕реВрд╕ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред
рдЕрдм, рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЛ рдХреБрдЫ _like_ MockHttp рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рд╕рд╛рде рд╣реА System.Net.Http
рдПрдкреАрдЖрдИ рдХреА рдбрд┐рд▓реАрд╡рд░реА "рдЖрдЙрдЯ рдСрдл рдж рдмреЙрдХреНрд╕" рдХреЗ рд╕рд╛рдеред AngularJS рдЯреАрдо рдиреЗ $httpBackEnd
рдХреЗ рд╕рд╛рде-рд╕рд╛рде $http
рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдорд╛рдирд╛ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдРрдкреНрд╕ рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреНрд╖рдорддрд╛ рдХреА рдмрд┐рд▓реНрдХреБрд▓ _ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Microsoft _didn't_ рдЗрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ "рднреНрд░рдо" рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдпрд╣рд╛рдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред :рдирд┐рд░рд╛рд╢: рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ @richardszalay рдФрд░ @PureKrome рдиреЗ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрдЯ рдореЗрдВ рдХрджрдо рд░рдЦрд╛ рд╣реИ рдФрд░ рдЕрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрдирдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкреАрдЫреЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рд╕рднреА рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреА рдЖрд╕рд╛рдиред :рдореБрд╕реНрдХреБрд░рд╛рдУ:
рдЕрднреА рдЗрд╕ рд╕реВрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдЕрдкрдирд╛ 2c рдЕрдВрджрд░ рдлреЗрдВрдХ рджреВрдВрдЧрд╛ред
рдореИрдВ рдЕрдЧрд▓реЗ рдЖрджрдореА рдЬрд┐рддрдирд╛ рд╣реА рдЧрддрд┐рд╢реАрд▓ рдореЙрдХрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреА рд╕рд░рд╛рд╣рдирд╛ рд╣реБрдИ рд╣реИ рдХрд┐ рдХреБрдЫ рдбреЛрдореЗрди (рдЬреИрд╕реЗ HTTP) рдХреЛ рдЕрдзрд┐рдХ рдбреЛрдореЗрди рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдкреАрдЫреЗ рдлреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореВрд▓ рдпреВрдЖрд░рдПрд▓ рдорд┐рд▓рд╛рди рд╕реЗ рдкрд░реЗ рдХреБрдЫ рднреА рдЧрддрд┐рд╢реАрд▓ рдореЙрдХрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБрдд рджрд░реНрджрдирд╛рдХ рд╣реЛрдЧрд╛, рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд╡реИрд╕реЗ рднреА рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд┐рдиреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ MockHttp рд╡реИрд╕реЗ рднреА рдХрд░рддрд╛ рд╣реИред
Rx рдХреЛ рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВ: IObservable рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдирдХрд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЧрддрд┐рд╢реАрд▓ рдореЙрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рд░рдЪрдирд╛рдУрдВ (рдЕрдиреБрд╕реВрдЪрдХреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдирд╛) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдкрд╛рдЧрд▓рдкрди рд╣реЛрдЧрд╛ред рдЖрд░рдПрдХреНрд╕ рдкрд░реАрдХреНрд╖рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрд╕ рдбреЛрдореЗрди рдХреЛ рдЕрдзрд┐рдХ рдЕрд░реНрдердкреВрд░реНрдг рдЕрд░реНрде рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ HTTP рдкрд░ рд╡рд╛рдкрд╕, рдЬреЗрдПрд╕ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдпрджреНрдпрдкрд┐, рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдгреАрдп рдХреЗ рдкрд░реАрдХреНрд╖рдг рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп XMLHttpRequest рдХреЛ рдирдХрд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдиреЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдХрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ред
рдпрд╣ рд╕рдм рдХрд╣рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЦреЛрдЬ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВред рдХреЛрдгреАрдп рдХрд╛ HTTP рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд▓реЗрдЦрди рдЗрд╕рдХреЗ HTTP рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рд╡рд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП MockHttp рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдЧрд░ рдХреЛрд░рдПрдлрдПрдХреНрд╕ рдЯреАрдо рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ (рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рди рд╣реИрдВ) рддреЛ рдореИрдВ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╡рд╛рдкрд╕ рдореЙрдХрдПрдЪрдЯреАрдкреА рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд░рд╣реВрдВрдЧрд╛ред
рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдкрд╕рдВрдж рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо Func
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
public static async Task<T> GetWebObjectAsync<T>(Func<string, Task<string>> getHtmlAsync, string url)
{
var html = await getHtmlAsync(url);
var info = JsonConvert.DeserializeObject<T>(html);
return info;
}
рдпрд╣ рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рдХреЛрдб рдХреЛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
Func<string, Task<string>> getHtmlAsync = u => Task.FromResult(EXPECTED_HTML);
var result = controller.InternalCallTheWeb(getHtmlAsync);
рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдмрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
public static HttpClient InitHttpClient()
{
return _httpClient ?? (_httpClient = new HttpClient(new WebRequestHandler
{
CachePolicy = new HttpRequestCachePolicy(HttpCacheAgeControl.MaxAge, new TimeSpan(0, 1, 0)),
Credentials = new NetworkCredential(PublishingCredentialsUserName, PublishingCredentialsPassword)
}, true));
}
[Route("Information")]
public async Task<IHttpActionResult> GetInformation()
{
var httpClient = InitHttpClient();
var result = await InternalCallTheWeb(async u => await httpClient.GetStringAsync(u));
...
}
рд▓реЗрдХрд┐рди рд╡реЗ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ... :)
рд╣рд╛рдп .NET рдЯреАрдо! рдмрд╕ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрдзрд╛рд░ рдХреЛ рдЫреВ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯреАрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреА рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рдПрдХ рдорд╣реАрдиреЗ + рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реИред
рд╢рд┐рд╡рд┐рд░ рдХреЗ рджреЛрдиреЛрдВ рдУрд░ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдВрджреБ рд╣реИрдВ - рд╕рднреА рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрдИрдПрдордУред
рдХреНрдпрд╛ рдЖрдк рд▓рдбрд╝рдХрд┐рдпреЛрдВ/рджреЛрд╕реНрддреЛрдВ рд╕реЗ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИрдВ?
рдЕрд░реНрдерд╛рддред
рдЯрд╛!
рдпрд╣ рднрд╛рдЧ 2 рдФрд░ 3 рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП "рдирдХрд▓реА" рд╣реИрдВрдбрд▓рд░ рдбрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ, рдпрд╛рдиреА HttpClient.DefaultHandler рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ HttpClient() рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╡рд░реНрддрдорд╛рди HttpClientHandler рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреАред "рдирдХрд▓реА" рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ рдЬреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдКрдкрд░ рдкреЛрд░реНрдЯреЗрдмрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╡реЗ рд╕реАрдзреЗ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рддреЛ, рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ "рдЗрдВрдЬреЗрдХреНрдЯ" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рддреЛ, рдпрд╣ рдЙрд╕ рдЪреАрдЬрд╝ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╡рд░реНрддрдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдпреЛрдЧрд╛рддреНрдордХ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдмрд╣реБрдд рд╣реА рд╢реАрдШреНрд░ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @davidsh : +1:
рдореИрдВ рдЦреБрд╢реА-рдЦреБрд╢реА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реВрдБрдЧрд╛ рдФрд░ рдЗрд╕ рд╕реНрдерд╛рди рдХреЛ рджреЗрдЦреВрдБрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдирд╛ рд░реЛрдорд╛рдВрдЪрдХ рд╣реИ рдХрд┐ рдпрд╣ рднрд╛рдЧ 1 рдирд╣реАрдВ рд╣реИ: рдореБрд╕реНрдХрд╛рди: .. рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рд╣реЛрддрд╛ рд╣реИ рдЙрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ: +1:
рдЖрдкрдХреЗ рдзреИрд░реНрдп рдФрд░ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж (рдЯреАрдо) - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддреЗ рд╣реИрдВ!
/ рдореБрдЭреЗ рдЦреБрд╢реА рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рд╣реИред
@ рдбреЗрд╡рд┐рдб рддреЛ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдУрдПрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреНрд░рд╢реНрди рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ?
рдпрд╣ рд╕рд╡рд╛рд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╢реЙрд░реНрдЯ рдЯрд░реНрдо рдРрдбрд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдЕрдВрдХ рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдереНрд░реЗрдб рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЕрдзреНрдпрдпрди рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдореИрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдореЗрдВ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред рддреЛ, рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдбрд┐рдЬрд╛рдЗрди/рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рддреНрд╡рд░рд┐рдд рдпрд╛ рдЖрд╕рд╛рди рд╣реЛред
рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рд╣рд╛рдВ, рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдХреЛрдИ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдПрдбрд┐рдЯрд┐рд╡ рд╣реИред рд╣рдо рдЕрднреА рднреА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреМрди рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрднрд╡ рд╣реИрдВред
/me рдЗрд╕ рдереНрд░реЗрдб рдкрд░ Resurrection
рдХрд╛рд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ...
~ рдзрд╛рдЧрд╛ рдореБрдбрд╝рддрд╛ рд╣реИ, рдХрд░рд╛рд╣рддрд╛ рд╣реИ, рдорд░реЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рдВрджрд╛ рдЖрддрд╛ рд╣реИ!
рдмрд╕ рдЕрдЧрд╕реНрдд 20 рд╡реАрдВ 2015 рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╕реНрдЯреИрдВрдбрдЕрдк рд╕реБрди рд░рд╣рд╛ рдерд╛ рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдмреАрдЯрд╛ 7 рдХреЗ рд╕рд╛рде рдХреНрд░реЙрд╕ рдкреНрд▓реЗрдЯ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдЧрд╛ред рд╡рд╛рд╣!
рддреЛ... рдХреНтАНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдпрд╛ рддреЛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛/рдпрд╛ .. рдмрд╕ рд╡рд┐рдирдореНрд░рддрд╛ рд╕реЗ рдХрд┐рд╕реА рдЪрд░реНрдЪрд╛ рдЕрдкрдбреЗрдЯ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ?
@PureKrome рдЗрд╕ рдкрд░ рдХреЛрдИ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди/рдЬрд╛рдВрдЪ рдХрд╛рд░реНрдп рд╣рдорд╛рд░реА рднрд╡рд┐рд╖реНрдп рдХреА рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЕрднреА, рд╣рдо рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛ рдзреНрдпрд╛рди рд╢реЗрд╖ System.Net рдХреЛрдб рдХреЛ GitHub рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдЗрд╕рдореЗрдВ рдореМрдЬреВрджрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ Xunit рдврд╛рдВрдЪреЗ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рдпрд╣ рдкреНрд░рдпрд╛рд╕ рдЕрднрд┐рд╕рд░рдг рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЯреАрдо рдХреЗ рдкрд╛рд╕ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордп рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж рдвреЗрд░ @davidsh - рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╕рдордп рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ :) рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦреЗрдВ! рдЧреБрдмреНрдмрд╛рд░рд╛:
http рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдереЛрдбрд╝рд╛ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдХреБрдЫ рд╕реНрд╡рдпрдВ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ http рд╕реЗрд╡рд╛ рдХрд╛ рдЖрд╕рд╛рди рдордЬрд╛рдХ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХреЗрд╡рд▓ рд╕реЗрд╡рд╛ url рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╛рдиреА HttpListener рдФрд░ OWIN рд╕реНрд╡рдпрдВ рд╣реЛрд╕реНрдЯ, рд▓реЗрдХрд┐рди рдЬрдЯрд┐рд▓ API рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдХрд▓реА рд╕реЗрд╡рд╛ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдСрдЯреЛрд░реЗрд╕реНрдкреЛрдиреНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ HttpClient рд╡рд░реНрдЧ рдХреА рдЗрдХрд╛рдИ-рдкрд░реАрдХреНрд╖рдг-рдХреНрд╖рдорддрд╛ рдкрд░ рдХреЛрдИ рдЕрджреНрдпрддрди? рдореИрдВ DeleteAsync рд╡рд┐рдзрд┐ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ Moq рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрдЪреБрдЕрд▓ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реИрдкрд░ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рд░рд┐рдЪрд░реНрдбреНрд╕рдЬрд╝рд╛рд▓реЗ рдХреЛ рд╡реЛрдЯ рджреЗрддрд╛ рд╣реВрдБредрдореЙрдХhttp!
рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИ! рд╕рд░рд▓ рдФрд░ рд╢рд╛рдирджрд╛рд░!
рд▓реЗрдХрд┐рди @YehudahA - рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП .... (рдпрд╣реА рдЗрд╕ рдХреЙрдирд╡реЛ рдХреА рдмрд╛рдд рд╣реИ) :)
@PureKrome рд╣рдореЗрдВ IHttpClient
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдИрдПрдл 7 рдЬреИрд╕рд╛ рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЖрдк рдХрднреА рднреА рдЖрдИрдбреАрдмреАрдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдпрд╛ рдЖрдИрдбреАрдмреАрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдбреАрдмреАрдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯрдСрдкреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
Richardszalay.MockHttp рдПрдХ рдЖрдЙрдЯ-рдСрдлрд╝-рдж-рдмреЙрдХреНрд╕ рд╕рдорд╛рдзрд╛рди рд╣реИред
рдпрд╣ рдПрдХ рдЖрдЙрдЯ-рдСрдл-рдж-рдмреЙрдХреНрд╕ рд╕рдорд╛рдзрд╛рди рд╣реИред
рд╣рдореЗрдВ IHttpClient рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдИрдПрдл 7 рдХреЗ рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЖрдк рдХрднреА рднреА рдЖрдИрдбреАрдмреАрдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдпрд╛ рдЖрдИрдбреАрдмреАрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдбреАрдмреАрдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯрдСрдкреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
рдпрд╣ рдареАрдХ рд╣реИ - рдореИрдВ рдкреВрд░реА рддрд░рд╣ рдЕрд╕рд╣рдордд рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реИрдВред
рдХреНрдпрд╛ рджреЛрдиреЛрдВ рддрд░реАрдХреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рд╣рд╛рдВред рдХреБрдЫ рд▓реЛрдЧ (рдореЗрд░реЗ рдЬреИрд╕реЗ) рдЦреЛрдЬ рдпреЛрдЧреНрдпрддрд╛ рдФрд░ рдкрдардиреАрдпрддрд╛ рдФрд░ рд╕рд░рд▓рддрд╛ рдЬреИрд╕реЗ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ EASIER рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рддреЗ рд╣реБрдП рдкрд╛рддреЗ рд╣реИрдВред
рдЕрдиреНрдп (рдЕрдкрдиреЗ рдЖрдк рдХреА рддрд░рд╣) рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓, рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрдард┐рди рдФрд░ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред (рдЬреЛ (рдореЗрд░реЗ рд▓рд┐рдП) рд╕рдорд░реНрдерди/рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ)ред
рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдЕрдкрдиреЗ рдореЗрд░рд╛ рдЕрдВрджрд╛рдЬрд╝рд╛ рд╣реИ :)
рд░рд┐рдЪрд░реНрдбреНрд╕рдЬрд╝рд╛рд▓реЗ рдХрд╣рддреЗ рд╣реИрдВ: "рдпрд╣ рдкреИрдЯрд░реНрди рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдХреЗ $httpBackend рд╕реЗ рдХрд╛рдлреА рдкреНрд░реЗрд░рд┐рдд рд╣реИ"ред
рд╕рд╣реА рдмрд╛рдд рд╣реИред рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: https://docs.angularjs.org/api/ngMock/service/ $httpBackend
@ рдкреНрдпреЛрд░рдХреНрд░реЛрдо
рд╣рд╛рдБ рдпрд╣ рдЖрд╕рд╛рди рд╣реИред
рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдирдХрд▓реА рдкреБрд╕реНрддрдХрд╛рд▓рдп/рдЗрдВрдЯрд░рдлреЗрд╕/рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрджрд┐ рдЖрдк рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕реЗрдЯрдЕрдк рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред
private static IDisposable FakeService(string uri, string response)
{
var httpListener = new HttpListener();
httpListener.Prefixes.Add(uri);
httpListener.Start();
httpListener.GetContextAsync().ContinueWith(task =>
{
var context = task.Result;
var buffer = Encoding.UTF8.GetBytes(response);
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
context.Response.OutputStream.Close();
});
return httpListener;
}
рдЙрдкрдпреЛрдЧ:
var uri = "http://localhost:8888/myservice/";
var fakeResponse = "Hello World";
using (FakeService(uri, fakeResponse))
{
// Run your test here ...
// This is only to test that is really working:
using (var client = new HttpClient())
{
var result = client.GetStringAsync(uri).Result;
}
}
@metzgithub рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рдХреНрд╖реНрдп рд╕реЗрд╡рд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЙрдЪрд┐рдд рдЕрдиреБрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЭреЗ 'рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг/рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг' рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рджреЗрддрд╛ рд╣реИ (рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдЧреИрд░-рдЦреБрд╢ рдкрде рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП)
рдореБрдЭреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣рд╛рдВ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рд▓реЛрдЧ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЖрд╡рд┐рд╖реНрдХрд╛рд░рд╢реАрд▓ рддрд░реАрдХреЗ рдорд┐рд▓рддреЗ рд╣реИрдВред рдореИрдВ рд╕рд╛рдордиреЗ рдмрддрд╛ рджреВрдВ рдХрд┐ рдЗрд╕ рддрд░реНрдХ рдореЗрдВ рдореИрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдордЬрдмреВрддреА рд╕реЗ рдЙрддрд░реВрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдорд▓рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЙрди рдШрдЯрдХреЛрдВ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪреБрдирддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдкрд░ рдЙрдирдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдПрдХ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдУрд╕реА рдХрдВрдЯреЗрдирд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рд┐рдВрдЧрд▓рдЯрди рдпрд╛ рдХреНрд╖рдгрд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдореИрдВ рдЯреЗрд╕реНрдЯ рдбреНрд░рд┐рд╡реЗрди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХреЗ рддрддреНрдХрд╛рд▓реАрди рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдП рдЕрднреНрдпрд╛рд╕ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рд▓рдЧрднрдЧ рдПрдХ рджрд╢рдХ рдкрд╣рд▓реЗ рд╕реАрдЦреА рдЧрдИ рдЯреЗрд╕реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрдирддрд╛ рд╣реВрдВ:
"рдПрдХ рд╡рд░реНрдЧ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╣реИ рдпрджрд┐ рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рддрдм рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдХреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВ"
рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдЬреЛ рдореИрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╡рд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдШрдЯрдХреЛрдВ рдХреА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛, рдЬрд┐рди рдкрд░ рд╡реЗ рдирд┐рд░реНрднрд░ рд╣реИрдВред рдЕрдЧрд░ рдореИрдВ рдХрд┐рд╕реА рдШрдЯрдХ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдШрдЯрдХ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЖрдИрдПрдордПрдЪрдУ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдкреАрдЖрдИ рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рддрд░реАрдХреЗ рдХреЛ рдХреЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреБрдЫ рддрдХрдиреАрдХреА рдмрд╛рдзрд╛рдПрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИрдВред рдореБрдЭреЗ рдкрд╕рдВрдж рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреИрд╕реЗ рдШрдЯрдХ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдиреЗ рдФрд░ рдПрдХ рд╣рд▓реНрдХрд╛ рдПрдбреЗрдкреНрдЯрд░/рд░реИрдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдмрдЪрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреЗрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдореБрдЭреЗ рдкрд╛рд░реНрдЯреА рдореЗрдВ рднреА рдереЛрдбрд╝реА рджреЗрд░ рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реА рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рднреА, рдореБрдЭреЗ рдЕрднреА рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдкрд░ рдЯреЗрд╕реНрдЯ рдХреЙрд▓ рд╡рд┐рд╢реЗрд╖ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рддрд╣рдд рдЕрдкрдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рдХреЛ рдХреИрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реВрдВ? рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИред рдореИрдВ рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рдХреЛрдИ рдореЗрд░реЗ ApiClient рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ "GoGetSomething" рдХрд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ " https://somenifty.com/api/something " рдкрд░ рдПрдХ GET рднреЗрдЬрддрд╛ рд╣реИред рдореИрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдХреЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ):
Mock<HttpClient> mockHttpClient = new Mock<HttpClient>();
mockHttpClient.Setup(x => x.SendAsync(It.IsAny<HttpRequestMessage>())).Verifiable();
ApiClient client = new ApiClient(mockHttpClient.Object);
Something response = await client.GoGetSomething();
mockHttpClient
.Verify(x => x.SendAsync(
It.Is<HttpRequestMessage>(m =>
m.Method.Equals(HttpMethod.Get) &&
m.RequestUri.Equals("https://somenifty.com/api/something"))));
рд▓реЗрдХрд┐рди, рдпрд╣ рдореБрдЭреЗ SendAsync рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдмрдирдиреЗ рджреЗрддрд╛ред
рдЕрдЧрд░ рдореИрдВ рдЙрд╕ рдореВрд▓ рдЪреАрдЬ рдХреЛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реА рдХрдХреНрд╖рд╛ рдЙрд╕ рдХреЙрд▓ рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░рд┐рдЯрд░реНрди рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреА рд╣реИред
рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдпрд╣ (рдореЗрд░реЗ рд▓рд┐рдП) рдРрд╕рд╛ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдЬреАрдм рдЪреАрдЬ рд╣реИред
рд▓реЗрдХрд┐рди, рдпрд╣ рдореБрдЭреЗ SendAsync рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдмрдирдиреЗ рджреЗрддрд╛ред
рдЖрдк HttpClient.SendAsync
рдкрджреНрдзрддрд┐ рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк HttpMessageHandler
рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдирдХрд▓реА рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рдЙрд╕ рдХреА SendAsync
рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рдЙрд╕ рд╣реИрдВрдбрд▓рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ HttpClient
рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
@jdcrutchley , рдЖрдк рдЗрд╕реЗ @richardszalay рдХреЗ MockHttp рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
public class MyApiClient
{
private readonly HttpClient httpClient;
public MyApiClient(HttpMessageHandler handler)
{
httpClient = new HttpClient(handler, disposeHandler: false);
}
public async Task<HttpStatusCode> GoGetSomething()
{
var response = await httpClient.GetAsync("https://somenifty.com/api/something");
return response.StatusCode;
}
}
[TestMethod]
public async Task MyApiClient_GetSomething_Test()
{
// Arrange
var mockHandler = new MockHttpMessageHandler();
mockHandler.Expect("https://somenifty.com/api/something")
.Respond(HttpStatusCode.OK);
var client = new MyApiClient(mockHandler);
// Act
var response = await client.GoGetSomething();
// Assert
Assert.AreEqual(response, HttpStatusCode.OK);
mockHandler.VerifyNoOutstandingExpectation();
}
@jdcrutchley рдпрд╛ рдЖрдк рдПрдХ рд╡рд┐рдзрд┐ SendAsync
рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд░реИрдкрд░ рд╡рд░реНрдЧ рдФрд░ рд░реИрдкрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ .. рдЬреЛ рдХреЗрд╡рд▓ _real_ httpClient.SendAsync
(рдЖрдкрдХреЗ рд░реИрдкрд░ рд╡рд░реНрдЧ рдореЗрдВ) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ @richardszalay рдХрд╛ MockHttp рдпрд╣реА рдХрд░ рд░рд╣рд╛ рд╣реИред
рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдЬреЛ рд▓реЛрдЧ рддрдм рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдордЬрд╝рд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛ рд╕рдХрддреЗ (рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдпрд╣ рдЖрднрд╛рд╕реА рдирд╣реАрдВ рд╣реИ)ред
рдореЙрдХhttp HttpMessageHandler рдкрд░ рдПрдХ рдирдХрд▓реА DSL рд╣реИред рдпрд╣ Moq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди DSL рдХреЗ рдХрд╛рд░рдг рдЗрд░рд╛рджрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдЕрдиреБрднрд╡ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рди рд╣реИ: HttpMessageHandler рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдПрдВ рдФрд░ рдЗрд╕рд╕реЗ рдПрдХ рдареЛрд╕ HttpClient рдмрдирд╛рдПрдВред рдЖрдкрдХрд╛ рдбреЛрдореЗрди рдШрдЯрдХ рдпрд╛ рддреЛ HttpClient рдпрд╛ HttpMessageHandler рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЯреАрдмреАрдПрдЪ, рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИред "рдореЙрдХреЗрдмрд▓ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ" рдФрд░ "рдореЙрдХреЗрдмрд▓ рдПрдЪрдЯреАрдкреАрдореЗрд╕реЗрдЬрд╣реИрдВрдбрд▓рд░" рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╕рдЪрдореБрдЪ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ: new HttpClient(mockHandler)
, рдФрд░ рдЗрд╕рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди "рдкреНрд░рддрд┐ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдФрд░ " рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" (рдпрд╛рдиреА рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рджрд╛рдЧреА рдирд╣реАрдВ рд╣реИ)ред
MockHttp рдЬреИрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗрд╡рд▓ рдПрдХ рдХреНрд▓реАрдирд░, рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ, рдкрд░реАрдХреНрд╖рдг API рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ HttpClient рдХреЛ рдирдХрд▓реА рдмрдирд╛рдиреЗ рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред
рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╡рд╛рдЧрдВрддреБрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдореВрд▓реНрдп рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рднреА рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ HttpClient рдиреЗ рдЖрд╕рд╛рди рдореЙрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╡реЗрдм рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЦреЛрдЬ рдХреА, рдпрд╣ рдзрд╛рдЧрд╛ рдкрд╛рдпрд╛, рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╢реБрд░реВ рд╕реЗ рдЕрдВрдд рддрдХ рдкрдврд╝рд╛ред @ Drub0y рдХреЗ рдЙрддреНрддрд░ рдиреЗ рдореБрдЭреЗ HttpMessageHandler рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рдорд╛рд░реНрдЧ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ред
рдореЗрд░реА рдкрд╕рдВрдж рдХрд╛ рдордЬрд╝рд╛рдХ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдврд╛рдВрдЪрд╛ Moq рд╣реИ, рд╢рд╛рдпрдж .NET рджреЗрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдорд╛рдирдХ рд╣реИред рд╕реБрд░рдХреНрд╖рд┐рдд SendAsync рд╡рд┐рдзрд┐ рдХреЛ рд╕реЗрдЯрдЕрдк рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде Moq API рд╕реЗ рд▓рдбрд╝рдиреЗ рдореЗрдВ рдПрдХ рдШрдВрдЯреЗ рдХреЗ рдХрд░реАрдм рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЕрдВрддрддрдГ Moq рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЬреЗрдиреЗрд░рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЧ рдорд╛рд░рд╛ред рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред
рдореИрдВрдиреЗ рдЗрд╕ рдЕрдиреБрднрд╡ рдХреЛ рдЗрд╕ рддрд░реНрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ рдПрдХ рд╡реЗрдирд┐рд▓рд╛ IHttpClient рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдиреЗ рдЬреАрд╡рди рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдШрдВрдЯреЗ рдмрдЪрд╛рдП рд╣реЛрдВрдЧреЗред рдЕрдм рдЬрдм рдореИрдВрдиреЗ рдПрдХ рдбреЗрдб-рдПрдВрдб рдорд╛рд░рд╛ рд╣реИ, рддреЛ рдЖрдк рдореБрдЭреЗ рдЙрди рджреЗрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реИрдкрд░/рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЙрдореНрдмреЛ рд▓рд┐рдЦрд╛ рд╣реИред
рдпрд╣ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдмрд┐рдВрджреБ рд╣реИ рдХреЗрди, рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдерд╛ рдХрд┐ HttpMessageHandler.SendAsync рд╕рдВрд░рдХреНрд╖рд┐рдд рдерд╛ред
рдлрд┐рд░ рднреА, рдореИрдВ рдЕрдкрдиреА рдкреНрд░рд╢рдВрд╕рд╛ рдХреЗ рд╕рд╛рде рдЦрдбрд╝рд╛ рд╣реВрдВ рдХрд┐ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд╣рд▓реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдФрд░ HttpMessageHandler рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ mockhttp рджреЗрдЦреЗрдВ)ред рдпрд╣ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЙрд▓ рдХреЛ рдПрдХ рдЕрдореВрд░реНрдд рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрджреНрдзрддрд┐ рдХреЛ рд╕реМрдВрдкрддрд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХ рдирдХрд▓реА-рдЕрдиреБрдХреВрд▓ рд╣реИред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ "рдЕрд╢реБрджреНрдз" рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдмрдирд╛рдо рдЯреИрдирд┐рдВрдЧ-рдПрдкреАрдЖрдИ-рд╕рддрд╣-рдкрд░реАрдХреНрд╖рдг-рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдкрд░ рдмрд╣рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП +1ред
рджреВрд╕рд░реЛрдВ рдХреА рддрд░рд╣, рдореИрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╡рд╛рдЧрдВрддреБрдХ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЪрд╛рд╣рд┐рдП, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ - рдФрд░ рдЕрдм рдХрдИ рдШрдВрдЯреЛрдВ рдмрд╛рдж рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕реАрдЦрдирд╛ рдкрдбрд╝рд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрддрдиреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рд╕рдбрд╝рдХ рд╕реЗ рдпрд╛рддреНрд░рд╛ рдХрд░рдиреА рдкрдбрд╝реА рд╣реИ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИ рдХрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдФрд░ рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдмрд╛рдд рдХреА рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рдФрд░ рдХреЗрд╡рд▓ рдореМрди рдореЗрдВ рд╕реВрддреНрд░ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ?
рдореИрдВ рдЕрдкрдиреА рдХрдВрдкрдиреА рдореЗрдВ рдПрдХ рдмрдбрд╝реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЦрд░рдЧреЛрд╢ рдЯреНрд░реЗрд▓реНрд╕ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдореЗрд░рд╛ рд╕рдордп, рдореЗрд░реА рдХрдВрдкрдиреА рдХреЗ рдкреИрд╕реЗ рдХреА рдмрдЪрдд рд╣реЛрддреА - рдФрд░ рдпрд╣ рд╢рд╛рдпрдж рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред
рдореИрдВ рд╢рд╛рдпрдж рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реИрдкрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдорд╛рд░реНрдЧ рдЬрд╛рдКрдВрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рд╣рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдкрд░, рдпрд╣ рдХрд┐рд╕реА рдХреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ HttpMessageHandler рдХреЛ рдХреНрдпреЛрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ред
рдпрджрд┐ HttpClient рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ - рддреЛ рд╢рд╛рдпрдж .net рдЯреАрдо рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ http рд╕рдорд╛рдзрд╛рди рдмрдирд╛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ?
@ рд╕реНрдХреЙрдЯ-рдорд╛рд░реНрдЯрд┐рди, HttpClient
рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╕рд┐рд░реНрдл рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ HttpMessageHandler
ред
HttpClient
рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдк HttpMessageHandler
рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдирдХрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдЖрдк Richardszalay mockhttp рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@ рд╕реНрдХреЙрдЯ-рдорд╛рд░реНрдЯрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдХреЗрд╡рд▓ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдк HttpMessageHandler рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдЖрдк HttpClient рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ HttpMessageHandler рдХреЗ рд╕рд╛рде _that_ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред
@richardszalay рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬреЛ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЕрдореВрд░реНрддрддрд╛ рдХреЛ рджреВрд░ рд░рдЦрдиреЗ рдореЗрдВ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
@YehudahA , рдореИрдВ HttpMessageHandler рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдХрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рд▓реЗрдХрд┐рди "рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛" рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЪрд┐рд▓реНрд▓рд╛рдпрд╛ред рдЬреИрд╕рд╛ рдХрд┐ @PureKrome рдиреЗ рдХрд╣рд╛, рдпрд╣ рдЦреЛрдЬ-рдХреНрд╖рдорддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрддрд╛, рддреЛ рдореИрдВ рдЙрд╕рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛ рдкрд╛рддрд╛ рдФрд░ рдХреБрдЫ рд╣реА рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЖ рдЬрд╛рддрд╛ред рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдБ рдПрдХ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрдИ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдиреЗ рдкрдбрд╝реЗред
рдореИрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рд╕реАрдорд╛рдУрдВ рдФрд░ рдЭрд┐рдЭрдХ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рдореИрдВ рдХреЗрд╡рд▓ рд╕рдореБрджрд╛рдп рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╕рдВрдж рд╣реИрдВ рдФрд░ рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХ рджреЗрдВ - рдЙрдирдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдирд╛ рдФрд░ рдЙрдирдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рдпрд╣ рдЦреЛрдЬ-рдХреНрд╖рдорддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрддрд╛, рддреЛ рдореИрдВ рдЙрд╕рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛ рдкрд╛рддрд╛ рдФрд░ рдХреБрдЫ рд╣реА рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЖ рдЬрд╛рддрд╛ ред рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдБ рдПрдХ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрдИ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдиреЗ рдкрдбрд╝реЗред
: рдПрд░реЛ_рдЕрдк: рдпрд╣ред рдпрд╣ рд╕рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдпрд╣ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬреЛрд░, рдореЗрд░рд╛ред
рдЬрдмрдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдЦреЛрдЬ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ "рдХрдИ рдШрдВрдЯреЗ" рдХреИрд╕реЗ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рдЧреБрдЧрд▓рд┐рдВрдЧ "рдореЙрдХ httpclient" рдЗрд╕ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреНрд░рд╢реНрди рдХреЛ рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдЙрдЪреНрдЪрддрдо рд░реЗрдЯреЗрдб рдЙрддреНрддрд░ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрд╡реАрдХреГрдд рдЙрддреНрддрд░ рдирд╣реАрдВ) HttpMessageHandler рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
рдПрдирдкреА - рд╣рдо рдЕрднреА рднреА рдЕрд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реИрдВред рдЯрд┐рд╕ рдСрд▓ рдЧреБрдб :)
рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ mscorlib рдЕрдкрдиреЗ рд╕рднреА рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рд░рд╣рд╛ рд╣реИ :)
рдХреНрдпрд╛ рд╣рдо рд╕рд┐рд░реНрдл рдЗрди httpclient рд╡рд░реНрдЧреЛрдВ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдлрд┐рд░ рдмрд╛рдХреА рд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВред
DI рд╕реЗрд╡рд╛ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд HttpClient рдХрд╛ рдЙрдкрд╣рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ?
рдореИрдВ рдПрдХ FakeHttpClientHandler рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ SendAsync рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд┐рдпреЛрд▓реЛрдХреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕ рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЖрдИрдкреА рдЖрдзрд╛рд░рд┐рдд рд╕реНрдерд╛рди рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИред рдореИрдВ рдирдХрд▓реА HttpClientHandler рдХреЛ рд╕реЗрд╡рд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рд░рдЪрдирд╛рдХрд╛рд░ рд╣реИрдВ, рдПрдХ рд╕реНрдерд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ рд╕реЗрд╡рд╛ рдкрддрд╛ рдФрд░ рдПрдХ рд╕реНрдерд╛рди рд╕реЗрд╡рд╛ рдкрддрд╛ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд HttpClientHandler рдХреЗ рд╕рд╛рдеред
public class GeoLocationService: IGeoLocationService {
private readonly string _geoLocationServiceAddress;
private HttpClient _httpClient;
private readonly object _gate = new object();
/// <summary>
/// Creates a GeoLocation Service Instance for Dependency Injection
/// </summary>
/// <param name="locationServiceAddress">The GeoLocation Service Hostname (IP Address), including port number</param>
public GeoLocationService(string locationServiceAddress) {
// Add the ending slash to be able to GetAsync with the ipAddress directly
if (!locationServiceAddress.EndsWith("/")) {
locationServiceAddress += "/";
}
this._geoLocationServiceAddress = locationServiceAddress;
this._httpClient = new HttpClient {
BaseAddress = new Uri(this._geoLocationServiceAddress)
};
}
/// <summary>
/// Creates a GeoLocation Service Instance for Dependency Injection (additional constructor for Unit Testing the Service)
/// </summary>
/// <param name="locationServiceAddress">The GeoLocation Service Hostname (IP Address), including port number.</param>
/// <param name="clientHandler">The HttpClientHandler for the HttpClient for mocking responses in Unit Tests.</param>
public GeoLocationService(string locationServiceAddress, HttpClientHandler clientHandler): this(locationServiceAddress) {
this._httpClient.Dispose();
this._httpClient = new HttpClient(clientHandler) {
BaseAddress = new Uri(this._geoLocationServiceAddress)
};
}
/// <summary>
/// Geo Location Microservice Http Call with recreation of HttpClient in case of failure
/// </summary>
/// <param name="ipAddress">The ip address to locate geographically</param>
/// <returns>A <see cref="string">string</see> representation of the Json Location Object.</returns>
private async Task<string> CallGeoLocationServiceAsync(string ipAddress) {
HttpResponseMessage response;
string result = null;
try {
response = await _httpClient.GetAsync(ipAddress);
response.EnsureSuccessStatusCode();
result = await response.Content.ReadAsStringAsync();
}
catch (Exception ex) {
lock (_gate) {
_httpClient.Dispose();
_httpClient = new HttpClient {
BaseAddress = new Uri(this._geoLocationServiceAddress)
};
}
result = null;
Logger.LogExceptionLine("GeoLocationService", "CallGeoLocationServiceAsync", ex.Message, stacktrace: ex.StackTrace);
}
return result;
}
/// <summary>
/// Calls the Geo Location Microservice and returns the location description for the provided IP Address.
/// </summary>
/// <param name="ipAddress">The <see cref="string">IP Address</see> to be geographically located by the GeoLocation Microservice.</param>
/// <returns>A <see cref="string">string</see> representing the json object location description. Does two retries in the case of call failure.</returns>
public async Task<string> LocateAsync(string ipAddress) {
int noOfRetries = 2;
string result = "";
for (int i = 0; i < noOfRetries; i ++) {
result = await CallGeoLocationServiceAsync(ipAddress);
if (result != null) {
return result;
}
}
return String.Format(Constants.Location.DefaultGeoLocationResponse, ipAddress);
}
public void Dispose() {
_httpClient.Dispose();
}
}
рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ, рдореИрдВ FakeClientHandler рдирд╛рдордХ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ HttpClientHandler рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЬреЛ SendAsync рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред рдПрдХ рдФрд░ рддрд░реАрдХрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, HttpClientHandler рдХрд╛ рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд▓реА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╣рдореЗрд╢рд╛ рдЖрдкрдХреЗ рдХрд░реНрдЬ рдореЗрдВ рд░рд╣реВрдВрдЧрд╛ред
public class GeoLocationServiceTests {
private readonly IConfiguration _configuration;
private IGeoLocationService _geoLocationService;
private HttpClientHandler _clientHandler;
internal class FakeClientHandler : HttpClientHandler {
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
// insert implementation here
// insert fake responses here.
return (Task<HttpResponseMessage>) null;
}
}
public GeoLocationServiceTests() {
this._clientHandler = new FakeClientHandler();
this._clientHandler.UseDefaultCredentials = true;
this._geoLocationService = new GeoLocationService("http://fakegeolocation.com/json/", this._clientHandler);
}
[Fact]
public async void RequestGeoLocationFromMicroservice() {
string ipAddress = "192.36.1.252";
string apiResponse = await this._geoLocationService.LocateAsync(ipAddress);
Dictionary<string, string> result = JsonConvert.DeserializeObject<Dictionary<string,string>>(apiResponse);
Assert.True(result.ContainsKey("city"));
string timeZone;
result.TryGetValue("time_zone", out timeZone);
Assert.Equal(timeZone, @"Europe/Stockholm");
}
[Fact]
public async void RequestBadGeoLocation() {
string badIpAddress = "asjldf";
string apiResponse = await this._geoLocationService.LocateAsync(badIpAddress);
Dictionary<string, string> result = JsonConvert.DeserializeObject<Dictionary<string, string>>(apiResponse);
Assert.True(result.ContainsKey("city"));
string city;
result.TryGetValue("city", out city);
Assert.Equal(city, "NA");
string ipAddress;
result.TryGetValue("ip", out ipAddress);
Assert.Equal(badIpAddress, ipAddress);
}
}
@danielmihai HttpMessageHandler рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рд╣реИред рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХрдВрдбрдХреНрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдкрдХреА рд╕реЗрд╡рд╛ рдкрд░рдд рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рдореЙрдХрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрддрд┐рджреЗрдп SendAsync рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рдХрд╛рд░рдг рд╕реЗ рдореЙрдХhttp рд▓рд┐рдЦрд╛ рдерд╛ (рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдХреНрдпреЛрдВрдХрд┐ рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдХрд┐рдВрдЧ рдлреАрдЪрд░реНрд╕ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред
@danielmihai рд░рд┐рдЪрд░реНрдб рдиреЗ рдЬреЛ рдХрд╣рд╛ рд╡рд╣ _pain_ рдХреЛ рдХрд╛рдлреА рд╣рдж рддрдХ рдмрддрд╛рддрд╛ рд╣реИ, рд╣рдо рд╕рднреА рдХреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рддреЗ рд╣реБрдП рдЕрднреА рд╕рд╣рдирд╛ рд╣реЛрдЧрд╛ред
HttpClient.Helpers as _another_ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ HttpClient рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИ .. рдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдирдХрд▓реА HttpMessageHandler
рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдирдХрд▓реА рдмрдирд╛ рд╕рдХреЗрдВред
рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдордЭ рд▓рд┐рдпрд╛ рд╣реИ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рд╣реИ... [рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ 'рджрд░реНрдж' рд╕реЗ рдирд┐рдкрдЯрд╛ рд╣реИ]
internal class FakeClientHandler : HttpClientHandler {
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
if (request.Method == HttpMethod.Get) {
if (request.RequestUri.PathAndQuery.Contains("/json/")) {
string requestPath = request.RequestUri.PathAndQuery;
string[] splitPath = requestPath.Split(new char[] { '/' });
string ipAddress = splitPath.Last();
// RequestGeoLocationFromMicroservice
if (ipAddress.Equals(ipAddress1)) {
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StringContent(response1);
return Task.FromResult(response);
}
// RequestBadGeoLocation
if (ipAddress.Equals(ipAddress2)) {
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StringContent(response2);
return Task.FromResult(response);
}
}
}
return (Task<HttpResponseMessage>) null;
}
}
рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕
рдХреГрдкрдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ, рдЕрдЧрд░ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╣реИрдВред
рдзрдиреНрдпрд╡рд╛рдж!
рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рдкреБрд░рд╛рдиреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред
@SidharthNabar
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ - рдпрд╣ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИред рдПрдХ HttpClient рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдирд╛ рдФрд░ рдЕрдкрдиреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓рд┐рдВрдЧ рдФрд░ рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ HttpClient рдХреЗ рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдирдХрд▓реА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХрд╛ рдХрд╛рдо рд╣реЛ рдЧрдпрд╛ред
рдЬрдм рдореИрдВ using
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди new
рдореЗрд░реЗ HttpClient рдЙрджрд╛рд╣рд░рдг рдЬреИрд╕реЗ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдореИрдВ рдЧреИрд░-рдЗрдВрдЬреЗрдХреНрд╢рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рдирд┐рдкрдЯрд╛рди рдХрд╣рд╛рдВ рдХрд░реВрдВ? HttpMessageHandler рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ HttpClient рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ?
рдкреВрд░реНрдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдпрд╛-рдЪрд░реНрдЪрд╛ рдПрдХ рддрд░рдл (рдореИрдВ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╣реВрдВ), рдХрдо рд╕реЗ рдХрдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдпрд╣ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ HttpMessageHandler рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдВ, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рдВ, рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ HttpMessageHandler рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рднреА рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
@richardszalay
рдЬрдмрдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдЦреЛрдЬ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ "рдХрдИ рдШрдВрдЯреЗ" рдХреИрд╕реЗ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рдЧреБрдЧрд▓рд┐рдВрдЧ "рдореЙрдХ httpclient" рдЗрд╕ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреНрд░рд╢реНрди рдХреЛ рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдЙрдЪреНрдЪрддрдо рд░реЗрдЯреЗрдб рдЙрддреНрддрд░ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрд╡реАрдХреГрдд рдЙрддреНрддрд░ рдирд╣реАрдВ) HttpMessageHandler рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
рдбреЙрдХреНрд╕, рдЖрдИрдПрдордПрдЪрдУ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд╕рд╣рдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред Google рдпрд╛ SO рдкреНрд░рд╢реНрди рдкреВрдЫрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИ, .NET рдХреЛрд░ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдкреНрд░рд╢реНрди рдЕрдк-рдЯреВ-рдбреЗрдЯрдиреЗрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╢реНрди рдФрд░ _new_ рдврд╛рдВрдЪреЗ рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдмреАрдЪ рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реЛ?)
рдЙрди рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝реЗ рд╣реИрдВ рдФрд░ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд┐рдП рд╣реИрдВ!
рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ http рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЙрд╕ http рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдирдХрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ http рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдХреЛрдИ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдирдХрд▓реА рдЗрдВрдЬреЗрдХреНрд╢рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореБрдЭреЗ http рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ (рдЬреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ) рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдПрдХ рдирдХрд▓реА рд╣реИрдВрдбрд▓рд░ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реБрдкреНрд╕ рд╣реИрдВред рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реА рдХрдХреНрд╖рд╛ HttpClient рдХреЗ рдмрдЬрд╛рдп HttpMessageHandler рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреА рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ ...
рдореЗрд░рд╛ рдорддрд▓рдм рдмрд╛рд▓реЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрдирдЬрд╛рди рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрдереНрдп рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд┐рд╖рдп рд╣реИ, рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ http рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@dasjestyr рд╣рдо рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдлреЗрд╕ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ; рд╡реЗ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИрдВред
рд╣рд╛рдБ, DI рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди/рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЖрджрд┐ред
@shaunluttin рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд┐рдирд╛ DI рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЕрдиреНрдпрдерд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдирд╣реАрдВ рдерд╛; рдореИрдВ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕ рдкрд░ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд┐рдирд╛, рдореИрдВ рдПрдХ рдирдХрд▓реА http рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рдХрд┐рд╕реА рднреА http рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (рддрд╛рдХрд┐ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ http рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ) рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ ' ve HttpClient рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд╛рдХреНрдп рдкрд░ рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рдереЗред
рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдЕрдкрдиреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдПрдХ рдирдХрд▓реА рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЗрд░реА рдХрдХреНрд╖рд╛рдПрдВ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдмреБрд░реА рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдирдХрд▓реА/рд╕реНрдЯрдмреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдирдХрд▓реА рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╕рдХрд▓ред
рд╕рд╛рде рд╣реА, рдЕрдХрд╛рджрдорд┐рдХ рд░реВрдк рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ - рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ _inheriting_ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрдкрдиреЗ рдХрд╣реАрдВ рдФрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕рджрд╕реНрдп рдХреЛ рдкрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдбрд╛рдкреНрдЯрд░) рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рд╡рд┐рд░рд╛рд╕рдд рдирд╣реАрдВред
рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдЕрдкрдиреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдПрдХ рдирдХрд▓реА рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЗрд░реА рдХрдХреНрд╖рд╛рдПрдВ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдмреБрд░реА рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдирдХрд▓реА/рд╕реНрдЯрдмреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдирдХрд▓реА рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╕рдХрд▓ред
рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рджрд┐рд▓/рдореВрд▓ рд╣реИ -> рдФрд░ рдпрд╣ _purely_ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмрд╛рдбрд╝ рдХреЗ рдПрдХ рддрд░рдл: рдирдХрд▓реА рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреНрдпреЛрдВрдХрд┐ <insert their rational here>
рдмрд╛рдбрд╝ рдХреЗ рджреВрд╕рд░реА рддрд░рдл: <insert their rational here>
рдХреА рд╡рдЬрд╣ рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐рдпрд╛рдВ, рд▓реЗрдХрд┐рди рд╡рд╣ рдЕрднреА рднреА рдПрдХ рдкрд┐рдЯрд╛ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ)ред
рдЦреИрд░ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдирдХрд▓реА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рджреВрд╕рд░реА рдХрдХреНрд╖рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╕реНрдЯрдмреНрд╕ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдореЛрдХреНрд╕ рд╡реЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднрд┐рдХрдерди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджрд╛рд╡рд╛ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде x рд░рд╛рд╢рд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирдХрд▓реА рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдПрдХ рд╕рдВрдЪрдпрдХ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ рдЬреЛ рд╣рд░ рдмрд╛рд░ SendAsync() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдмрдврд╝рддрд╛ рдЧрдпрд╛ред рд╡рд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓рд╛ рдерд╛, рд╢реБрдХреНрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд▓реЛред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореЙрдХрд┐рдВрдЧ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдорд╛рдирдХ рд╣реИред
рд╣рд╛рдБ - рдпрд╣рд╛рдБ рдЖрдкрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдБ
рдХреГрдкрдпрд╛, рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ, IHttpClient
, рдЕрд╡рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдпрд╛ рд╕реБрд╕рдВрдЧрдд рд░рд╣реЗрдВ рдФрд░ рдмреАрд╕реАрдПрд▓ - IList
, IDictionary
, ICollection
рдореЗрдВ рдЕрдкрдиреЗ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡реИрд╕реЗ рднреА "рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдард┐рди" рд╣реИрдВред рдмрд┐рд▓реНрд▓реА, IEnumerable
рд╕реЗ рднреА рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред
рдПрдХ рдЧрдВрднреАрд░ рдиреЛрдЯ рдкрд░, "рдЖрдк рдмрд╕ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ" (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрд╕рд╛рди рдФрд░ рдХреНрд▓реАрдирд░ рд╣реИ) рдФрд░ "рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ" рдЬреИрд╕реЗ рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рдареАрдХ рд╣реИ, рдЖрдк рдЗрд╕реЗ рд╕рднреА .net рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╡реИрд╕реЗ рднреА рдХрд░рддреЗ рд╣реИрдВ) , рдмрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рджреЗрдВ рдХрд┐ рд╡реЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
@lasseschou IList
, IDictionary
, ICollection
рдФрд░ IEnumerable
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред IHttpClient
рдХреЗрд╡рд▓ HttpClient
рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдЖрдкрдХреЗ рддрд░реНрдХ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдмреАрд╕реАрдПрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рджреЗрдЦрдХрд░ рджреБрдЦ рд╣реЛрдЧрд╛ред
рдЬрдм рддрдХ рдХреЛрдИ рдирд╛рдЯрдХреАрдп рдЯреНрд░реЗрдбрдСрдлрд╝ рди рд╣реЛ, IHttpClient
рдХрд┐рд╕реА рднреА рддрд░рд╣ рдордЬрд╛рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдЕрдореВрд░реНрдд рд╕реНрддрд░ рд╣реИред рдЖрдкрдХрд╛ рдРрдк рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдРрдк рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдореЗрдВ HttpClient
рд▓рдкреЗрдЯреЗрдВ рдФрд░ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдПрдВред
@ jnm2 - рдмреНрдпрд╛рдЬ рд╕реЗ рдмрд╛рд╣рд░, рдЖрдкрдХреЛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ IHttpClient
рдордЬрд╛рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдЕрдореВрд░реНрдд рд╕реНрддрд░ рд╣реИ?
рдореИрдВ рдирдлрд░рдд рдпрд╛ рдЯреНрд░реЛрд▓рд┐рдВрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдИрдорд╛рдирджрд╛рд░ Q.
(рд╕реАрдЦрдирд╛ рдкрд╕рдВрдж рд╣реИ, рдЖрджрд┐)ред
рдореИрдВ рдПрдХ рд╣реА рдмрд╛рдд рдкреВрдЫрдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдХрд░ рдПрдХ рдЖрджрд░реНрд╢ рд╕реНрддрд░ рдХрд╛ рдЕрдореВрд░реНрддрддрд╛ рд╣реИред
рдпрд╣ рдирд┐рд░рдкреЗрдХреНрд╖ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЗ рдРрдк рдХреА рдХреНрдпрд╛ рдЬрд╝рд░реВрд░рдд рд╣реИ рдФрд░ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмреАрдЪ рдпрд╣ 1: 1 рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдкреАрдЖрдИ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ- HTTP рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА- рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рдХреЗ рдПрдХ рдЕрдВрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░рд┐рд╡рд╣рди рддрдВрддреНрд░ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдЙрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддреА рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рд╢реЗрд╖ рдРрдк рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреА рд╕реЗрд╡рд╛ рдХреЗ рдПрдкреАрдЖрдИ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдмрд╛рд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ "рдиреЗрд╡рд░ рдореЙрдХ рдП рдЯрд╛рдЗрдк рдпреВ рдиреЙрдЯ рдУрди рдУрди" рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд╛рдИрдПрдордПрдорд╡реАред
рдпрд╣ рднреА рджреЗрдЦреЗрдВ http://martinfowler.com/articles/mocksArentStubs.html рд╢рд╛рд╕реНрддреНрд░реАрдп рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдо рдореЙрдХрд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ред
рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ HttpClient рдЗрддрдиреА рдмрдбрд╝реА рдкреНрд░рдЧрддрд┐ рд╣реИ
WebClient, XMLHttpRequest, рдХрд┐ рдпрд╣ HTTP рдХрд░рдиреЗ рдХрд╛ рдкрд╕рдВрджреАрджрд╛ рддрд░реАрдХрд╛ рдмрди рдЧрдпрд╛ рд╣реИ
рдХреЙрд▓ред рдпрд╣ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рдЖрдзреБрдирд┐рдХ рд╣реИред рдореИрдВ рд╣рдореЗрд╢рд╛ рдирдХрд▓реА рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ
рд╕реАрдзреЗ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛
рдЙрди рдПрдбреЗрдкреНрдЯрд░ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рднреА рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдФрд░ рддрднреА рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ: рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд╣реИ
рдЖрдИрдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯред рд╢рд╛рдпрдж рддреБрдо рд╕рд╣реА рд╣реЛ, рдЗрд╕рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реИ
рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЧрд▓рдд рд╕реНрддрд░ред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛
рдЗрд╕реЗ рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдПрдХ рдФрд░ рд╡рд░реНрдЧ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реИред рдореИрдВ рдмрд╕ рдирд╣реАрдВ рджреЗрдЦрддрд╛
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рди рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдгред
рд▓рд╛рд╕реЗ рд╢реЙрдЙ
рд╕рдВрд╕реНрдерд╛рдкрдХ рдФрд░ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХрд╛рд░реА рдЕрдзрд┐рдХрд╛рд░реА
http://mouseflow.com
[email protected]
https://www.facebook.com/mouseflowdotcom/
https://twitter.com/mouseflow
https://www.linkedin.com/company/mouseflow
рдЧреЛрдкрдиреАрдпрддрд╛ рд╕реВрдЪрдирд╛: рдпрд╣ рдИ-рдореЗрд▓ рд╕рдВрджреЗрд╢, рдХрд┐рд╕реА рднреА рдЕрдиреБрд▓рдЧреНрдирдХ рд╕рд╣рд┐рдд, рд╣реИ
рдЗрдЪреНрдЫрд┐рдд рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ (рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдУрдВ) рдХреЗ рдПрдХрдорд╛рддреНрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕рдореЗрдВ рдЧреЛрдкрдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ,
рд╕реНрд╡рд╛рдорд┐рддреНрд╡, рдФрд░/рдпрд╛ рдХрд╛рдиреВрди рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реАред рдХреЛрдИ рднреА
рдЕрдирдзрд┐рдХреГрдд рд╕рдореАрдХреНрд╖рд╛, рдЙрдкрдпреЛрдЧ, рдкреНрд░рдХрдЯреАрдХрд░рдг рдпрд╛ рд╡рд┐рддрд░рдг рдирд┐рд╖рд┐рджреНрдз рд╣реИред рдЕрдЧрд░ рддреБрдо
рдЗрдЪреНрдЫрд┐рдд рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдЙрддреНрддрд░ рдИ-рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рдХ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ
рдФрд░ рдореВрд▓ рд╕рдВрджреЗрд╢ рдХреА рд╕рднреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрдВред
12 рдирд╡рдВрдмрд░ 2016 рдХреЛ 14:57 рдмрдЬреЗ, рдЬреЛрд╕реЗрдл рдореБрд╕рд░ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:
рдпрд╣ рдирд┐рд░рдкреЗрдХреНрд╖ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ
рдпрд╣ рдХреИрд╕реЗ 1:1 рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдРрдк рдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ HttpClient рд╕рд╛рд░ рдХреНрдпрд╛ рд╣реИред рдкрд░рдВрддреБ
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдкреАрдЖрдИ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ- рдХреБрдЫ рднреА
HTTP рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдЕрдВрд╢ред рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ
HttpClient рдкрд░рд┐рд╡рд╣рди рддрдВрддреНрд░ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддрд╛ рд╣реИ,
рдЖрдкрдХрд╛ рд╢реЗрд╖ рдРрдк рдЖрдкрдХреА рд╕реЗрд╡рд╛ рдХреЗ рдПрдкреАрдЖрдИ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдХреЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдЕрдореВрд░реНрдд, HttpClient рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдпред-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/dotnet/corefx/issues/1624#issuecomment -260123552, рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/ACnGPp3fSriEJCAjXeAqMZbBcTWcRm9Rks5q9cXlgaJpZM4EPBHy
.
рдореИрдВ рдХреБрдЫ рдЕрдЬреАрдм рдЗрдирдкреБрдЯ рд╕реБрди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдирдХрд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдкрд░рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП "рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛" рд╣реИ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдкрд╛рд╕ рдЗрддрдиреА рд╕рд╛рд░реА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░рд┐рдпрд╛рдВ рдФрд░ рдЙрдЬрд╛рдЧрд░ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рд╣реЛрдиреЗ рдХреЗ рдлреИрд╕рд▓реЗ рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдореИрдВ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛рдиреНрд╡рд┐рдд рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░ рд▓реЗрдВрдЧреЗ, рдпрджрд┐ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдЗрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЛ рддреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, "рдЬрд╛рдирдиреЗ" рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рд░реИрдкрд░ рд╣реИ рдЬреЛ рд╕рд╛рд░реНрдердХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдлреНрд░реЗрдорд╡рд░реНрдХ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдпреБрдХреНрддрд┐рдХрд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдФрд░ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЧрд╣рд░реА рдкрд░рд┐рдЪрд┐рддрддрд╛ рдХреЗ рдХрдИ рдЧреИрд░-рд╕рдВрдкреБрдЯрд┐рдд рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдореЙрдХрд┐рдВрдЧ/рд╕реНрдЯрдмрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ред
рдХреГрдкрдпрд╛ рдареАрдХ рдХрд░реЗрдВ!
рдмрд╕ рдЗрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рддреЛ рдореЗрд░реЗ 2c рдХреЛ рдЕрдВрджрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ ...
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ HttpClient рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдореВрд░реНрдЦрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ SendAsync
рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, _so_ HttpResponseMessage
, HttpResponseHeaders
, HttpContentHeaders
, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ, рдЖрдкрдХреЗ рдореЙрдХ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд▓реНрджреА рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рднреА рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВ? рдореИрдВ OwinHttpMessageHandler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ
HttpMessageHandler
рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реАрдЯреАрдЖрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИредрдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдПрдХ рдПрдорд╡реАрд╕реА 6 рд╣реИрдВрдбрд▓рд░ рд╣реИ рдЬреЛ рд╕рдорд╛рди рдХрд░рддрд╛ рд╣реИ ....
_рдЬреАрд╡рди рдареАрдХ рд╣реИред_
@damianh : рдбреЙрдЯрдиреЗрдЯ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреИрд╕реА рдХрдХреНрд╖рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрд╡рд┐рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдХреНрдпреЛрдВ рд╣реИ? рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ (рдУрд╡рд┐рди рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдПрд╕реНрдкрдХреЛрд░) рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдореИрдВ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реВрдВ" :) рдХреЗ рд╕рд╛рде "рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ" рдХреА рдЪрд┐рдВрддрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдУрд╣ _testing_ HttpClient... рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╡рд┐рд╖рдп рдЙрди рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рдирдореЗрдВ a
рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ред рдореБрдЭреЗ рдмреБрд░рд╛ рдордд рдорд╛рдирдирд╛ред :)
5 рджрд┐рд╕рдВрдмрд░ 2016 рдХреЛ рд╢рд╛рдо 7:56 рдмрдЬреЗ, " brphhelps " [email protected] рдиреЗ рд▓рд┐рдЦрд╛:
@damianh https://github.com/damianh : рд▓реЛрдЧреЛрдВ рдХреЛ рдбреЙрдЯрдиреЗрдЯ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
HttpClient рдЬреИрд╕реА рдХрдХреНрд╖рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрд╡рд┐рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ? рд╕рдВрднрд╡рдд: рдпрд╣
рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдУрд╡рд┐рди рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрд╕реНрдкрдХреЛрд░) рд▓реЗрдХрд┐рди
рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХреНрдпрд╛ рд╣реИ" рдХреА рдЪрд┐рдВрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ
рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рддрд░реАрдХрд╛ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рднреА рд╣реИ"
"рдореИрдВ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реВрдВ" рдХреЗ рд╕рд╛рде :)ред
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/dotnet/corefx/issues/1624#issuecomment-264942511 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AADgXJxunxBgFGLozOsisCoPqjMoch48ks5rFF5vgaJpZM4EPBHy
.
@damianh - рдпрд╣ рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рди рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЪрд┐рддреНрд░ рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореИрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ (рдпрд╛ рдПрдХ DI'ed one) рдореЗрдВ рдЙрддреНрддреАрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ - рдУрд╡рд┐рди рддрд╕реНрд╡реАрд░ рдореЗрдВ рдХрд╣рд╛рдВ рдЖрддрд╛ рд╣реИ?
рдпрд╣ рдУрд╡рд┐рди рдирд╣реАрдВ рд╣реИ рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ (рдЬреЛ
рдиреЗрдЯ рдХреЛрд░/рдиреЗрдЯрд╕реНрдЯреИрдВрдбрд░реНрдб рдкрд░ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛) рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВред
рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ HttpMessageHandler рдПрдХ рдЗрди-рдкреНрд░реЛрд╕реЗрд╕ рдмрдирд╛рддрд╛ рд╣реИ
рдбрдореА HTTP рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЗрди-рдореЗрдореЛрд░реА HTTP рдЕрдиреБрд░реЛрдзред
Aspnet Core рдХрд╛ TestServer, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрдЯрд╛рдирд╛ рдиреЗ рдХрд┐рдпрд╛ рдерд╛, рд╡рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рд░рд╛рд╕реНрддрд╛ред
рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ HttpClient DI'd рд╣реИ рдЬрд╣рд╛рдВ _it_ рдореЗрдВ рдПрдХ рд╣реИ
HttpMessageHandler рдиреЗ рдЗрд╕рдореЗрдВ рд╕реАрдзреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рдЧрд╛рдпрд╛ред рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдФрд░
рджреГрдврд╝ рд╕рддрд╣ рд╣реИред
рдореЙрдХрд┐рдВрдЧ, рдЯреЗрд╕реНрдЯ рдбрдмрд▓ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк, рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВ рдЕрднреА рднреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛
рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЦрд┐рд▓рд╛рдлред рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, IHttpClient рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
5 рджрд┐рд╕рдВрдмрд░ 2016 рдХреЛ рд░рд╛рдд 8:15 рдмрдЬреЗ, " brphhelps " [email protected] рдиреЗ рд▓рд┐рдЦрд╛:
@damianh https://github.com/damianh - рдпрд╣ рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ a . рд╣реИ
рдирд┐рд░реНрднрд░рддрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
рддрд╕реНрд╡реАрд░ рдореЗрдВ рднреАред рдореИрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ a . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
HttpClient рдЙрджрд╛рд╣рд░рдг (рдпрд╛ рдПрдХ DI'ed one) рдореЗрдВ рдкрд╛рд░рд┐рдд - рдУрд╡рд┐рди рдХрд╣рд╛рдВ рдЖрддрд╛ рд╣реИ
рдЪрд┐рддреНрд░?
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/dotnet/corefx/issues/1624#issuecomment-264947538 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AADgXEESfQj9NnKLo8LucFLyajWtQXKBks5rFGK8gaJpZM4EPBHy
.
@damianh - рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭреЗрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ - рд▓реЗрдХрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдорд╛рд░реНрдЯ рдореЙрдХ рдХреЗ рд╕рд╛рде рдбрдореА HTTP рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ- рдЬреИрд╕реЗ @richardszalay рдХреА MockHttp рд▓рд╛рдЗрдмреНрд░реЗрд░реАред
рдХрдо рд╕реЗ рдХрдо рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ :)ред
рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдХрд▓реНрдк рдЕрдЪреНрдЫреЗ рд╣реИрдВ :)
5 рджрд┐рд╕рдВрдмрд░ 2016 рдХреЛ рд░рд╛рдд 8:39 рдмрдЬреЗ, " brphhelps " [email protected] рдиреЗ рд▓рд┐рдЦрд╛:
@damianh https://github.com/damianh - рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭреЗрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╣реИрдВ
рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ - рд▓реЗрдХрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдбрдореА HTTP рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рд╕реНрдорд╛рд░реНрдЯ рдореЙрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ-- рдЬреИрд╕реЗ @richardszalay
https://github.com/richardszalay рдХреА MockHttp рд▓рд╛рдЗрдмреНрд░реЗрд░реАред
рдХрдо рд╕реЗ рдХрдо рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ :)ред
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/dotnet/corefx/issues/1624#issuecomment-264954210 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AADgXOl4UEDGYCVLpbvwhueaK52VtjH6ks5rFGhlgaJpZM4EPBHy
.
@damianh рдиреЗ рдХрд╣рд╛:
рд╡рд┐рдХрд▓реНрдк рдЕрдЪреНрдЫреЗ рд╣реИрдВ :)
рд╣рд╛рдВ - рдЙрд╕ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ЁЯСН рдХреМрди рд╕рд╛, рдЖрдИрдПрдордУ .. рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рдирд╣реАрдВ рд╣реИ ЁЯШв **
рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреЗ рдПрдЪрдПрдордПрдЪ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рдЧрд╛рдиреЗ рдХреЗ рдФрдЪрд┐рддреНрдп рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рдореИрдВ рдЕрднреА рдпрд╣реА рдХрд░ рд░рд╣рд╛ рд╣реВрдВред _рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ_, рдореБрдЭреЗ рдПрдХ рджреВрд╕рд░рд╛ рд╕реАрдЯреАрдЖрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реАрдЯреАрдЖрд░ рдкрд░рдо рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛) _рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП_ред рдмрд╕ рдЙрд╕ рд╡рд╛рдХреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╕реЛрдЪреЗрдВ -> рдореИрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ ... рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЛ _do stuff_ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдореЗрд░реА рдХрдХреНрд╖рд╛ рдХрд╛ рдЕрдВрддрд┐рдо-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рдЙрдкрднреЛрдХреНрддрд╛ рдХрднреА рднреА _really_ рдЙрд╕ ctor рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ ... рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рдЧрдВрдз рдЖрддреА рд╣реИред
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдореБрджреНрджреЗ рдкрд░ рд╡рд╛рдкрд╕ -> рдЕрднреА рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реИред рд╣рдо HttpClient
рдХреЗ рдЗрдВрдЯрд░реНрдирд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ _рд╣реИ_ рд╕реЗ _рд╕реАрдЦрддреЗ рд╣реИрдВред рд╕рдЪрдореБрдЪ рдмреЛрдирдЯ рдЦреЛрд▓реЗрдВ рдФрд░ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рджреЗрдЦреЗрдВред (рдореИрдВ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛ рдХрд┐ рдореБрдЭреЗ рд╕рд░ рдлрд╛рдЙрд▓рд░ рдж рд╡рд┐рд╕реНрдордпрдХрд╛рд░реА тДв рд╕реЗ рдЯреАрдПрд▓; рдбреАрдЖрд░ рдорд┐рд▓рд╛, рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рд╢реЛрдз рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛)ред
рддреЛ - рдиреЛ-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдмрд╛рдд рдХреЗ рд╕рд╛рде, рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрдм рдЦрд░рд╛рдм рд╣реЛрдЧрд╛, рдХреГрдкрдпрд╛? рдЖрджрд┐ред рдпрд╛рдж рд░рдЦреЗрдВ -> рдореИрдВ рд╣рдореЗрд╢рд╛ рдЫреЛрдЯреЗ/рд╕рд░рд▓ рд╕реЗ рдордзреНрдпрдо рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ _option_ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рддрд╛ рд░рд╣рд╛ рд╣реВрдВ ... рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ 100% рдирд╣реАрдВред
рдореИрдВ рдЖрдкрдХреЛ рдбреЗрдорд┐рдпрди рдХреЛ рдЯреНрд░реЛрд▓ рдпрд╛ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдмрд╕ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
* рдирд┐рдВрдЬрд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ -> рд╣рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ / рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реИрдкрд░ / рдЖрджрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛: рдХрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдЬреЛ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, *рдЖрдЙрдЯ-рдСрдл-рдж-рдмреЙрдХреНрд╕ ред
рдЕрд░реЗ @PureKrome , рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╕рд┐рд░реНрдл рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ред
'рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ' рд╢рдмреНрдж рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрдЗрдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪреЗрдВред рддреЛ рд╣рдо рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ FooClass
рд╣реИ рдЬрд┐рд╕рдореЗрдВ HttpClient
(рдпрд╛ HMH
) рдкрд░ рд╕реАрдЯреАрдЖрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо _mock_ HttpClient
рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ " FooClass
рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐, рдХрд┐рд╕реА рднреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░, рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рдг-рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, рдХрд┐рд╕реА рднреА рд╕рд╛рдордЧреНрд░реА-рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, _any рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдпреВрдЖрд░рдПрд▓ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓/рд╣реЛрд╕реНрдЯ/рд╕рдВрд╕рд╛рдзрди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTTP рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣реЗрдбрд░_ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ, рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░, рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдХреЛрдб, рдХреБрдХреАрдЬрд╝, рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ, рдЯреНрд░рд╛рдВрд╕рдлрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, рдХреИрд╢реЗ рдХрдВрдЯреНрд░реЛрд▓ рд╣реЗрдбрд░, рдЖрджрд┐ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ, рдХрд╛рд░реНрдп рд░рджреНрдж рдЕрдкрд╡рд╛рдж рдЖрджрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред
HttpClient
рдПрдХ рдИрд╢реНрд╡рд░ рд╡рд╕реНрддреБ рдХреА рддрд░рд╣ рд╣реИ; рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред HTTP рднреА рдПрдХ рджреВрд░рд╕реНрде рд╕реЗрд╡рд╛ рдХреЙрд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд░реЗ рдкрд╣реБрдВрдЪрддреА рд╣реИред
рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реИ? рдЕрдм рдИрдорд╛рдирджрд╛рд░ рд░рд╣реЛ :)
** рдирд┐рдВрдЬрд╛ рднреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрджрд┐ рдЖрдк FooClass
рдЗрдХрд╛рдИ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡рд╣ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреБрдЫ рдЬреЗрд╕рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА Func<CancellationToken, Task<JObject>>
рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕реАрдЯреАрдЖрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛрдЧреАред
рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрдм рдЦрд░рд╛рдм рд╣реЛрдЧрд╛, рдХреГрдкрдпрд╛
рдРрд╕рд╛ рдирд╣реАрдВ рдХрд╣рд╛! рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ IHttpClient
рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдП) рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмреА) рднрдЧрд╡рд╛рди рд╡рд╕реНрддреБ рдЪрд┐рдВрддрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг? IAssembly
ред
@damianh - "рдЧреЙрдб рдХреНрд▓рд╛рд╕" рдХреА рд╕реНрдерд┐рддрд┐ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ HttpClient рдПрдХ рдИрд╢реНрд╡рд░ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИред рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╣ рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗ HTTP рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ :)ред
рддреЛ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ .NET рдврд╛рдВрдЪреЗ рдиреЗ рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдПрдХ рдИрд╢реНрд╡рд░ рд╡рд░реНрдЧ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рд╣реИ... рд╣рдо рдЕрдкрдиреА рдЪрд┐рдВрддрд╛ рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рдо рдЗрд╕реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд╕рдорд╛рд╣рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдЖрд╕рд╛рди рд╣реИ - рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдореЙрдХрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (Moq рдПрдХ рдмреЗрд╣рддрд░реАрди рдЙрджрд╛рд╣рд░рдг рд╣реИ) рдФрд░ HttpClient рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рд╕реЗрд╡рди рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рд░рдВрдкрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд▓реЛрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╛рдзрд╛рди рд▓реЗрдХрд░ рдЖ рд░рд╣реЗ рд╣реИрдВ :)ред
рд╡реНрдпрд╛рдХрд░рдг рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрдкрд╛рджрди :D
@damianh рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ HttpClient
рдХреБрдЫ uber God Class рдХреА рддрд░рд╣ рд╣реИред
рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдореБрдЭреЗ рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ _рдмрд╣реБрдд рд╕рд╛рд░реЗ purmutations_ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдВрджрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрд╛рд╣рд░ рдЖрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдореИрдВ рдХреБрдЫ рдПрдкреАрдЖрдИ рд╕реЗ рд╕реНрдЯреЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред https://api.stock-r-us.com/aapl
ред рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ JSON рдкреЗрд▓реЛрдб рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЙрд╕ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдЬрд┐рди рдЪреАрдЬреЛрдВ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЗрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдПрдЪрдПрдордПрдЪ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл _real_ рдПрдЪрдПрдордПрдЪ рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ, рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди - рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ (рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдкрд░) рдЗрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рдмрд╕ рдХрд╣реЗрдВ:
_рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдореИрдВ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ рдФрд░ рдореБрдЭреЗ рдореЗрд░рд╛ рдЕрдЪреНрдЫрд╛ рдЬреЗрд╕рди рдкреЗрд▓реЛрдб рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИред_
рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрднреА рднреА рдЗрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рдФрд░ рдЪрд┐рдВрддрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрддрдирд╛ рдЖрд╕рд╛рди рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?
рдпрд╛ ... рдХреНрдпрд╛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХрд╛ рдПрдХ рдЦрд░рд╛рдм рддрд░реАрдХрд╛ рд╣реИред рд╣рдореЗрдВ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реИрдХреА рд╣реИ? рдмреЗрд╣рдж рд╕рд╕реНрддрд╛? рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкреНрд░рд╡рдг?
рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХрд╣рддрд╛ рд╣реВрдВред рдореИрдВ рд╣реЗрдбрд░ рдпрд╛ рдХреИрд╢-рдХрдВрдЯреНрд░реЛрд▓ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдХреЗрд╡рд▓ VERB + URL (рдФрд░ рдкреЗрд▓реЛрдб, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреИрдЪ-рдСрд▓-рдж-рдерд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИ: рдЯреАрдПрдо: рдФрд░ рдлрд┐рд░ рд╣рд╛рд░ рдорд╛рди рд▓реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдмреБрд░рд╛ рд╣реБрдЖ :(
рддреЛ рдореИрдВ рдпрд╛ рддреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЧрд▓рдд рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╛рдиреА рдореИрдВ рдЕрднреА рднреА рдЕрдкрдиреА n00b рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рд┐рд▓рд╛ рдирд╣реАрдВ рд╕рдХрддрд╛) -рдпрд╛- рдпрд╣ рдИрд╢реНрд╡рд░ рд╡рд░реНрдЧ рд╣рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рджреБрдГрдЦ рдХрд╛ рдвреЗрд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред
HTTP рднреА рдПрдХ рджреВрд░рд╕реНрде рд╕реЗрд╡рд╛ рдХреЙрд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд░реЗ рдкрд╣реБрдВрдЪрддреА рд╣реИред
рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реИ? рдЕрдм рдИрдорд╛рдирджрд╛рд░ рд░рд╣реЛ :)
рдореЗрд░реЗ рд▓рд┐рдП, HttpClient
рдПрдХ _рдирд┐рд░реНрднрд░ рд╕реЗрд╡рд╛_ рд╣реИред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ _What_ рд╕реЗрд╡рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рддреА рд╣реИ, рдореИрдВ рдЗрд╕реЗ _something рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдХреБрдЫ рд╕рд╛рдорд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореЗрд░реЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рдмрд╛рд╣рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ рдмрд╛рд╣рд░реА рд╢рдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рди рдХрд░реЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕реЗ рд╣рд╛рдИрдЬреИрдХ рдХрд░рдирд╛ рдФрд░ рдЙрди рд╕реЗрд╡рд╛-рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЕрднреА рднреА рдХрд╛рдо рдХреА _my_ рдЗрдХрд╛рдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рддрд░реНрдХ рдХрд╛ рдореЗрд░рд╛ рдЫреЛрдЯрд╛ рд╕рд╛ рдЯреБрдХрдбрд╝рд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЕрдЧрд░ рдореИрдВ рдкреВрд░реЗ рдмреНрд░рд╣реНрдорд╛рдВрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рддрд░реНрдХ рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ _and_ рдХреЗ рднреАрддрд░ рдореМрдЬреВрдж рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рднрд░реЛрд╕рд╛/рдПрдХреАрдХреГрдд рдирд╣реАрдВ рд╣реИред
** рдПрдХ рдФрд░ рд╕рдВрдкрд╛рджрди: рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЕрдЧрд░ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдИрд╢реНрд╡рд░ рд╡рд╕реНрддреБ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдмрд╛рддрдЪреАрдд рдЗрд╕реЗ рдХреБрдЫ рдХрдо рдХрд░рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ... рдмреЗрд╣рддрд░? рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдИрд╢реНрд╡рд░реАрдп рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИ? (рдмрд╕ рдмрд╣рд╕ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ) ..
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рд╕реАрдЯреАрдЖрд░ (рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реАрдЯреАрдЖрд░ рдкрд░рдо рдкреНрд░рджрд╛рди рдХрд░рдирд╛) рдмрдирд╛рдирд╛ рд╣реИред рдмрд╕ рдЙрд╕ рд╡рд╛рдХреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╕реЛрдЪреЗрдВ -> рдореИрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ ... рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рд╛рдорд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдореЗрд░реА рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рдЙрдкрднреЛрдХреНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╕реАрдЯреАрдЖрд░ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ ... рдЬреЛ рдореБрдЭреЗ рдЧрдВрдз рдХрд░рддрд╛ рд╣реИ
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣ рд░рд╣реЗ рд╣реИрдВ:
"рдореБрдЭреЗ рджреВрд╕рд░рд╛ ctor рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдЬреЛ HttpMessageHandler рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ" ... рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдЗрд╕реЗ HttpClient рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ
"рдореИрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ" ... рдХрдард┐рди?
@richardszalay - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рднрд╛рд╡рдирд╛ рдорд┐рд▓рддреА рд╣реИ рдХрд┐ @PureKrome рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдЕрддреНрдпрдзрд┐рдХ рд░рд╛рдп рд╡рд╛рд▓реА рдкрд░реАрдХреНрд╖рдг рд░рдгрдиреАрддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЧрд▓рдд рдордд рд╕рдордЭреЛ, рдореИрдВ рдЖрдкрдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдЯрдиреЗрдЯ рдХреЛрд░ рдХреА рдЙрдЪреНрдЪ рдЙрдореНрдореАрдж рд╣реИ =)ред
рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ MockHttp рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг/рдордЬрд╛рдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдЙрд▓рдЯрд╛ рдирд┐рд░реНрднрд░рддрд╛ .NET рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓рднреВрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рд╕реАрдЯреАрдЖрд░-рдЗрдВрдЬреЗрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрджрд┐ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЗ рдЖрдИрдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЕрднреА рднреА рдПрдХ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдиреЗ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ ...
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрджрд┐ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЗ рдЖрдИрдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЕрднреА рднреА рдПрдХ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдиреЗ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ ...
рдорд╛рдирд╛ред рдореИрдВ рдЕрдкрдиреА рд╕реЛрдЪ рдореЗрдВ "рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛" рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рдЪрдореБрдЪ рдЕрднреА-рдЕрднреА рдЙрдард╛ рдерд╛ рдФрд░ рдЕрдкрдиреЗ рдорд╕реНрддрд┐рд╖реНрдХ рдореЗрдВ рдЕрдкрдиреА рдПрдХрд▓ рдХреЛрд╢рд┐рдХрд╛ рдХреЛ рдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдХреГрдкрдпрд╛ рдореЗрд░реА 'ctor' рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ, рдЕрдЧрд░ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЛрд░рд┐рдпрдд рдореЗрдВ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рд╣реИ
рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рдкреНрд░рд╢реНрди рдкрд░ рдПрдХ рдХрджрдо рдкреАрдЫреЗ рд╣рдЯ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ HttpClient
рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ _can_ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ FooClass
рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдореИрдВ FooClass
рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрдирдкреБрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ FooClass
рдХреЛ рдЕрдкрдиреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ . рдЗрд╕ рд╕рднреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА рдЖрд╢реНрд░рд┐рдд рд╡рд╕реНрддреБ рдХреА рдЕрдВрддрдбрд╝рд┐рдпреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛; рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдЙрд╕ рддрд░рд╣ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдореЗрд░рд╛ FooClass
рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП: рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдордЬрд╛рдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗ рдЬреИрд╕рд╛ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЕрдм рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореБрдЭреЗ HttpClient
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рдиреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдореЗрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЗрдВрдЬреЗрдХреНрд╢рди рдирд┐рд░реНрднрд░рддрд╛ ( HttpClient
) рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ ( HttpMessageHandler
) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреА рд╣реИред рдЕрдкрдиреА рдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореБрдЭреЗ рдПрдХ рдирдХрд▓реА рдЬрдВрдЬреАрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдПрдХ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдереАрдо: рдореИрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛ рд╕рдХрддрд╛, рдпрд╣ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдХрд┐ рдЗрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рднреА рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреБрдЫ рднреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рди рд╣реЛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдХреНрд╖рд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдХреЛ рдордЬрд╛рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг 101 рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ =)ред
рдЖрдк рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╡рд┐рд╖рдп рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
"рдореЗрд░реЗ рд▓рд┐рдП, рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рдЖрд╢реНрд░рд┐рдд рд╕реЗрд╡рд╛ рд╣реИред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдХреБрдЫ рдРрд╕реА рдЪреАрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдореЗрд░реЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рдмрд╛рд╣рд░ рдХреБрдЫ рд╕рд╛рдорд╛рди рдХрд░рддрд╛ рд╣реИред" - рдкреНрдпреЛрд░рдХреНрд░реЛрдо
"рдЕрдм рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореБрдЭреЗ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рдкрд░рд╡рд╛рд╣ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдореЗрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЗрдВрдЬреЗрдХреНрд╢рди рдирд┐рд░реНрднрд░рддрд╛ (рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ) рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ (рдПрдЪрдЯреАрдкреА рдореИрд╕реЗрдЬ рд╣реИрдВрдбрд▓рд░) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реИред" - рдереЛрдбреЗрди
"рдореИрдВ рдПрдХ рд╣реА рдмрд╛рдд рдкреВрдЫрдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдХрд░ рдПрдХ рдЖрджрд░реНрд╢ рд╕реНрддрд░ рдХрд╛ рдЕрдореВрд░реНрддрддрд╛ рд╣реИред" -- рджрд╛рд╕рдЬреЗрд╕реНрдЯреАрд░реЛ
"HttpMessageHandler рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рд╣реИред рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рдПрдХ HttpClient рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдкрдХреА рд╕реЗрд╡рд╛ рдкрд░рдд HttpClient рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреА рд╣реИред" -- рд░рд┐рдЪрд░реНрдбреНрд╕рдЬрд╝рд╛рд▓реЗ
"рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдмрдирд╛ рд░рд╣реЗрдЧрд╛ - рдЖрдкрдХреЛ рдПрдХ рдирдХрд▓реА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ HttpClient рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдиреАрдЪреЗ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред" -- рд╕рд┐рджреНрдзрд╛рд░реНрде рдирдмрд░реА
"рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкрд╛рд╕ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЗрд╕реЗ рд╕реАрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рджрд╕реНрдп рд╡рд░реНрдЪреБрдЕрд▓ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА HttpMessageHandler рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреЙрдЗрдВрдЯ" - ericstj
"рдпрджрд┐ рдПрдкреАрдЖрдИ рдирдХрд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореЙрдХреЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ рд╢реБрджреНрдз рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред" -- рдХреНрд░рд┐рдЬрд╝рд┐рд╕реНрддреЛрдлрд╝ рдХреНрд╡рд╛рд▓рд┐рдирд╛
"рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде, рдпрджрд┐ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдлреЗрдХ рдореИрд╕реЗрдЬ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЬреЛ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрджреЗ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪреНрдЪ рдмрд╛рдзрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред" -- ctolkien
рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реИ? рдЕрдм рдИрдорд╛рдирджрд╛рд░ рд░рд╣реЛ :)
рдореБрдЭреЗ рдирд╣реА рдкрддрд╛ред рдкрд░реАрдХреНрд╖рдг рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрдпрд╛рди рдереЛрдбрд╝рд╛ рд╕реНрдЯреНрд░реЙрдореИрди рд╣реИред рдореБрджреНрджрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╣реИ рдЬреЛ http рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ, рддрд╛рдХрд┐ рдХреЛрдб рдЙрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЪрд▓ рд╕рдХреЗ ... рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ http рдХреЙрд▓ рди рдХрд░реЗрдВред рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╣рдореЗрдВ рд╣рд▓реНрдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рд╣реИред
HttpClient рдЕрдм рддрдХ рдХреА рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реИ рдХрд┐
рдЖрд╢реНрд░рд┐рдд "рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЛ рдХреЙрд▓" рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдк рдЖрдЧреЗ TCP рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред рд╣реЗрд╣
7 рджрд┐рд╕рдВрдмрд░ 2016 рдХреЛ рд╕реБрдмрд╣ 5:34 рдмрдЬреЗ, "рдЬреЗрд░реЗрдореА рд╕реНрдЯреИрдлреЛрд░реНрдб" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:
рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реИ? рдЕрдм рдИрдорд╛рдирджрд╛рд░ рд░рд╣реЛ :)
рдореБрдЭреЗ рдирд╣реА рдкрддрд╛ред рдкрд░реАрдХреНрд╖рдг рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрдпрд╛рди рдереЛрдбрд╝рд╛ рд╕реНрдЯреНрд░реЙрдореИрди рд╣реИред рдмрд╛рдд рдордЬрд╛рдХ рдХрд░рдиреЗ рдХреА рд╣реИ
рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛ http рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рджрд╛рдИрдВ рдУрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛
рд╢рд░реНрддреЗрдБред рд╣рдореЗрдВ рд╣рд▓реНрдХреА рдирд┐рд░реНрднрд░рддрд╛ рдЪреБрдирдиреА рдЪрд╛рд╣рд┐рдП рдереА рдпрд╛ рдирд╣реАрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ
рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/dotnet/corefx/issues/1624#issuecomment-265353526 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AADgXPL39vnUbWrUuUBtfmbjhk5IBkxHks5rFjdqgaJpZM4EPBHy
.
рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг 101 рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ =)ред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдЕрднреНрдпрд╛рд╕ рдХреА рд╕рд╣реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИред рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдЙрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ , рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдФрд░, рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ, рдЕрдЧрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд╡рд┐рд░реБрджреНрдз рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддрд╛, рддреЛ рдпрд╣ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡рд╣ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдмрд┐рдирд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕реЗрд╕ рдХреЗ рдмрд┐рд▓реНрдб рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЯреВрдЯрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ред рдЖрдк рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдЧ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ - рд╢рд╛рдпрдж рдореИрдВ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ? рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдХрднреА рдирд╣реАрдВ рдкреВрдЫрд╛ред рддреЛ рдХреНрдпрд╛ рдореЗрд░реА рдбреЛрдореЗрди рд╕реЗрд╡рд╛ рдХреА HttpClient рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдирд╣реА рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАред рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдореВрд░реНрдд рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░рдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдКрдВрдЧрд╛ред рдареАрдХ рд╣реИ, рддреЛ рдЙрд╕ рдкрд░рдд рдореЗрдВ рдЬреЛ рдореЗрд░реЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЕрдореВрд░реНрддрддрд╛ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреА рд╣реИ - рдХрд╣реАрдВ рдКрдкрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛, _something_ рдХреЛ HttpClient рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐ рдХреБрдЫ рдФрд░ рдЬреЛ рдореИрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдЙрд╕рд╕реЗ рдХреБрдЫ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдФрд░ рдХреБрдЫ рд╣реИ рдореИрдВ рдореИрдВ рдЕрднреА рднреА рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБред
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдордзреНрдпрд╕реНрде рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рд╕рдлрд▓ рдХреЙрд▓ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рд▓реЗрди-рджреЗрди рдХреЗ рдХреБрдЫ рд░реВрдкреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдлрд▓ рдХреЙрд▓ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рд╣ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ рд▓реЗрди-рджреЗрди, рддреЛ рдореБрдЭреЗ рдЙрд╕ рдкрд░реАрдХреНрд╖рдг рдХреА рд╢рд░реНрддреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рдпрд╣ рдХрд╣ рд╕рдХреВрдВ рдХрд┐ рджреЛрдиреЛрдВ рдкрд░рд┐рджреГрд╢реНрдп рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреА рд░рд╛рдп рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдмрд╛рд╕реНрдЯреНрд░рдХреНрд╢рди рдХрд╛ рд╕рд╣реА рд╕реНрддрд░ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЗ "рд╕реНрддрд░" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИред рдХреЛрдИ HTTP рдХреЙрд▓ рдХреЛ рдПрдХ рд╕реЗрд╡рд╛ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдореЗрдВ рд╕реЗ рдХреБрдЫ рдЕрднреА рднреА рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕ HTTP рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ "рд░реИрдкрд░" рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрд╣ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рдирдХрд▓реА рд╣реИрдВрдбрд▓рд░ рджреЗрдХрд░ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдореИрдВ рдЕрднреА рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрд╕ рдХрд╡рд░реЗрдЬ рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдлрд╝реНрдпреВрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрдо рд╕реЗ рдХрдо рдирдХрд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред
рд▓реЗрдХрд┐рди, рдЕрдм рдореБрдЭреЗ рдмреИрдХрдкреАрдбрд▓ рдХрд░рдиреЗ рджреЛред рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдпрд╣ рдПрдХ рдирдХрд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЬреЛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореЛрдЯрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдХреНрд▓рд╛рдЗрдВрдЯ" рдирд╛рдо рд╕реЗ рдЙрдкрдЬреА рдПрдХ рдорд╛рдирд╕рд┐рдХ рдмрд╛рдд рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧрд▓рдд рд╣реИ, рдмрд▓реНрдХрд┐, рдпрд╣ рдЕрдиреНрдп "рдХреНрд▓рд╛рдЗрдВрдЯ" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрдг рд╕реЗ рдереЛрдбрд╝рд╛ рдмрд╛рд╣рд░ рд╣реИ рдЬрд┐рд╕реЗ рдХреЛрдИ рдЗрди рджрд┐рдиреЛрдВ рдЬрдВрдЧрд▓реА рдореЗрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред рдЖрдЬ рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реЗ "рдХреНрд▓рд╛рдЗрдВрдЯ" рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЗрд╡рд╛ рдХреЗ рдкрд╣рд▓реВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдХреЛрдИ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдирд╛рдо рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рд╡реЗ рд╡рд╣реА рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдХрд╛ рдордЬрд╛рдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЙрдбрд╝рд╛рдПрдВрдЧреЗ, рд╣реИ рдирд╛?
рдЕрдм рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╛рдЗрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореВрд▓ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рд╣рдорд╛рд░реА рдЗрдЪреНрдЫрд╛ рдФрд╕рдд рдбреЗрд╡рд▓рдкрд░ рдХреА рдкреНрд░рд╡реГрддреНрддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рднрдпрд╛рдирдХ рдЕрднреНрдпрд╛рд╕ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдХрдо рдЖрдВрдХрддреЗ рд╣реИрдВ рдХрд┐ HttpClient рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣реИрдВрдбрд▓рд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣реИрдВрдбрд▓рд░ рд╕рд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдордЬрд╛рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдореИрдВ рдмрд┐рдХ рдЧрдпрд╛ рд╣реВрдБред рдореИрдВ рдЕрдм рдореЙрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП HttpClient рдкрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред
рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдВрдШрд░реНрд╖ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдЕрдкрдирд╛ IHttpHandler рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдпрд╛ рдФрд░ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдореЗрд░реЗ рдареЛрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрдЬреАрдм рдЧрдзреЗ рд╕рд╛рдорд╛рди рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЬ рдЗрд╕ рдкрд░ рдЖрдпрд╛: http://www.davesquared.net/2011/04/dont-mock-types-you-dont-own.html
рдЬреИрд╕реЗ рд╣реА рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ HTTP рд╢реАрд░реНрд╖рд▓реЗрдЦ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдареАрдХ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд░реАрд╕реНрдЯрдлреБрд▓ рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ) рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ HttpRequestHeaders DefaultRequestHeaders
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп {Method}Async()
рдХреЛ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ HttpClient рдХреЛ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдмрдирд╛ рджреЗрдЧрд╛ред
@abatishchev рд▓реЗрдХрд┐рди рдЖрдк рдкреНрд░рддреНрдпреЗрдХ HttpRequestMessage рдкрд░ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@richardszalay рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИ, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ HttpClient рдХреЛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред {Method}Async()
HttpRequestMethod
рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ SendAsync()
рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдмрд╛рдХреА рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреНрдпрд╛ рд╣реИ?
рд▓реЗрдХрд┐рди рдлрд┐рд░ рдмрд╛рдХреА рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреНрдпрд╛ рд╣реИ?
99% рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ред
рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░рдирд╛ 1% рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ? рдореБрдЭреЗ рд╢рдХ рд╣реИред
рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдпрд╣ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрди рддрд░реАрдХреЛрдВ рдореЗрдВ HttpResponseMessage рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдзрд┐рднрд╛рд░ рдерд╛ред
@abatishchev рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЕрдЧрд░ рдореИрдВ рдЦреБрдж рдХреЛ рдЖрдкрдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдкрд╛рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред
рдореИрдВ рд╢рд╛рдпрдж HttpMessageHandler рдФрд░ рд╕рдВрднрд╡рддрдГ HttpRequestMessage рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирдХрд▓реА (рдмрдирд╛рдо рдирдХрд▓реА) рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдиреАрдЪреЗ рдЖрдк рдЦрд░рдЧреЛрд╢ рдХреЗ рдЫреЗрдж рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрддрдирд╛ рд╣реА рдЖрдкрдХреЛ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирдХрд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдореВрд▓реНрдп рд╡рд╕реНрддреБрдУрдВ (рдЬреИрд╕реЗ HttpContent) рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдПрдХ рд╡реНрдпрд░реНрде рдЕрднреНрдпрд╛рд╕ рд╣реИред рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ HttpMessageHandler рдХреЛ рдПрдХ рд╕реАрдЯреАрдЖрд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрд╢реНрд░рд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рдФрд░ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирдХрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдорд╛рд░реНрдЧ рд╣реИред рдореИрдВ рдпрд╣ рднреА рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ HttpClient рдХреЛ рд▓рдкреЗрдЯрдирд╛ рднреА рд╕рдордп рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИ ...
рдпрд╣ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдЖрд╢реНрд░рд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдЖрдкрдХрд╛ рдирдХрд▓реА рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдФрд░ рд╕рд╛рдордЧреНрд░реА рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдЖрд╢реНрд░рд┐рдд рдХреЛрдб рдЙрдиреНрд╣реЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдлрд┐рд░ рд╕реЗ рд╣реИ, рдЬреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
@dasjestyr рдХреНрдпрд╛ рдЖрдкрдиреЗ HttpMessageHandler
рдпрд╛ HttpRequestMessage
рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрдЬрд╛рдп HttpClient
(рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рдмрдирд╛рдиреЗ рдЬреИрд╕рд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛ ..
/ рдореБрдЭреЗ рдЙрддреНрд╕реБрдХред
@PureKrome рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣реАрдВ рд╕реЗ рдореБрдЭреЗ рдЬрд▓реНрджреА рд╕реЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рд╡реНрдпрд░реНрде рдерд╛ред рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬреЛ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдПрдХ рдмрд┐рдВрджреБ рдерд╛ рдЬрд┐рд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХреБрдЫ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рдмрдирд╛рдиреЗ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдпрд╣ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рдо рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рдерд╛ (рдпрд╛рдиреА "рдпреЛ, рд╣рд░ рдХреЛрдИ рд╕реАрдзреЗ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ")ред рдХреЗрд╡рд▓ рд╣реИрдВрдбрд▓рд░ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╡рд╣ рд╕рдм рдХреБрдЫ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИред
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реЗрд╕реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ рдЬреЛ рдПрдХ рддрд░рд▓ рдЕрдиреБрд░реЛрдз рдирд┐рд░реНрдорд╛рддрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣реА рдереА, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдпрд╛ рд╣реИрдВрдбрд▓рд░ рдЪреЗрди рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЛ рдХреНрд░реЙрд╕-рдХрдЯрд┐рдВрдЧ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ, рдСрде, рд░реАрдЯреНрд░реА рд▓реЙрдЬрд┐рдХ рдЗрддреНрдпрд╛рджрд┐) рдЬреЛ рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рдмрд╛рдХреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣реИрдВрдбрд▓рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрдЪрд╛рддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд░реБрдХрдирд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХрд╛ рдореЙрдХрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рддрдм HttpResponseMessage рдХреЗ рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдЕрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджрд┐рд▓рдЪрд╕реНрдкред рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ (рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣?) рдореЗрд░реА рд╕рд╣рд╛рдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХ (рдирдХрд▓реА) рдареЛрд╕ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ .. рдмрдирд╛рдо .. рдЙрд╕ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред
рдореИрдВ рдЕрднреА рднреА рдЙрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓рд┐рдЦрдирд╛ рдпрд╛ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ :)
рдореБрдЭреЗ рдирдХрд▓реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рдореИрдВ рдРрд╕рд╛ рддрдм рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрдм рдореИрдВ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдиреЗ рд╕реЗ рдКрдм рдЧрдпрд╛ рд╣реВрдВред рдореЗрд░реЗ рд╕рднреА http рд╕рд╛рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рдордп рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИред рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рд╣реИрдВрдбрд▓рд░ рдХреЛ рдлрд┐рдХреНрд░ рдХрд░рдирд╛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИред
рдЬрдм рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдбрдмреЗрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдореЙрдХрд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реБрд╕рдВрдЧрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдмрд╛рдХреА рдХреЛрдбрдмреЗрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЙрд╕реА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдореИрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ IHttpClient рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЬреИрд╕реЗ ADL SDK рд╕реЗ IFileSystemOperaions рдпрд╛ ADF рдкреНрд░рдмрдВрдзрди SDK рд╕реЗ IDataFactoryManagementClient, рдЖрджрд┐ред
рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ HttpClient рдХреЛ рдХреЗрд╡рд▓ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрд╕рд▓реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдЬрдм рднреА рдЖрдк рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХреБрдЫ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдирдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдкрдиреЗ рд╕рдВрдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ - рдпрд╣ рдПрдХ рдмрдбрд╝реА рдбреАрд▓ рд╣реИред рджреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВ, рдФрд░ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЗ рдЖрд╢реНрд░рд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреЛ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдХреЗрд╡рд▓ рд╡рд╣ рдбреЗрдЯрд╛ рдЬреЛ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЬреЛ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реЛрдЪреЗрдВ: рдХреНрдпрд╛ рдЖрдк рдХрднреА рднреА HttpClient рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рд╕реЗ рдмрджрд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ? рд╕рдВрднрд╡ рд╣реИ... рд▓реЗрдХрд┐рди рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдХреНрдпреЛрдВ рдЙрдард╛рдПрдВ? рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдЪрд░ рд╣реИред рдЖрдк рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреНрд░рд╛рд╣рдХ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╡реЗрдмрдПрдкреАрдЖрдИ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╣реИрдВрдбрд▓рд░ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ (рджреЗрдЦреЗрдВ: рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИрдВрдбрд▓рд░)ред рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЗрд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВ, рдЙрддрдирд╛ рд╣реА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЗрдЯ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реНрдерд┐рд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ... рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ ... рдЬреЛ рднреА рд╣реЛред
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд┐рд╕ рд▓рд┐рдП рд╣реИрдВред рд╡реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВ - рдпрд╣ рдЙрдирдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХрд╛ рдПрдХ рдЪрддреБрд░ рддрд░реАрдХрд╛ рдерд╛ред рдХреЗрд╡рд▓ рдЙрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдирд╛ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реИред Microsoft рдиреЗ рдЖрдкрдХреЛ рд╡рд╣ рджрд┐рдпрд╛ рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рдмрдВрдзрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, HttpMesageHandler рд╕рд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Moq рдЬреИрд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЙрдХрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЕрднреА рднреА рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рд╣реЗ @dasjestyr - рдореБрдЭреЗ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрд░реА рдЪрд░реНрдЪрд╛ рдХреЗ рдПрдХ рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдП рд╣реЛрдВрдЧреЗред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ (рдбреЗрд╡рд▓рдкрд░) рдХреЛ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ .. рдирдХрд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ _main_ рдмрд┐рдВрджреБ рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ рдирд╣реАрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ (рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ) рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдЖрд░ рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ (рдФрд░ рдЗрд╕рд▓рд┐рдП рдордЬрд╛рдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) ... рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИрдВред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдорд╣рд╛рдХрд╛рд╡реНрдп рдзрд╛рдЧреЗ рдХрд╛ рдореБрдЦреНрдп рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ .. рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд┐рдЯрд╛ рд╣реИред
"рдЬрд╛рдУ HttpClient рдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реАрдЦреЛ, рдЬреЛ рдЖрдкрдХреЛ HttpMessageHandler, рдЖрджрд┐ рддрдХ рд▓реЗ рдЬрд╛рдПрдЧрд╛" рдХреА рд╕реНрдерд┐рддрд┐ рдПрдХ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рд╣реИред рд╣рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рддреЛ рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕ рдкрд┐рдЯрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рдВ, рдкрд┐рдЯрд╛ рдПрдХ рд░рд╛рдп рд╣реИ - рдореИрдВ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ред рдХреБрдЫ рд▓реЛрдЧ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рдХрд┐ рдпрд╣ рдПрдХ рдкрд┐рдЯрд╛ рд╣реИ, рдЖрджрд┐ред
рдЕрд╕рд▓реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдЬрдм рднреА рдЖрдк рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХреБрдЫ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдирдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдорд╛рдирд╛! рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рдерд╛ - рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдпрд╛ рд╢рд┐рдХреНрд╖рдг рдпрд╛ рдХреБрдЫ рдФрд░ рдХреА рдХрдореА рд╣реЛ рд╕рдХрддреА рд╣реИред
рд╕рд╛рде рд╣реА, рдЖрдкрдХреЗ рдЖрд╢реНрд░рд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреЛ HttpClient рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдХреЗрд╡рд▓ рд╡рд╣ рдбреЗрдЯрд╛ рдЬреЛ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рд╣рд╛рдБ - рд╕рд╣рдорддред
рдЬреЛ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдЖрддрд╛ рд╣реИред
рдПрдХ рдХреНрдпрд╛? рд╣реБрд╣? рдУрд╣ - рдЕрдм рдЖрдк рдореБрдЭрд╕реЗ рд╣реБрдб рдЦреЛрд▓рдиреЗ рдФрд░ рдкреНрд▓рдВрдмрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВ? ... рдмрд╛рд░-рдмрд╛рд░ рдКрдкрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдВред
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реЛрдЪреЗрдВ: рдХреНрдпрд╛ рдЖрдк рдХрднреА рднреА HttpClient рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рд╕реЗ рдмрджрд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ?
рдирд╣реАрдВред
.. рдЖрджрд┐ ..
рдЕрдм, рдореЗрд░рд╛ рдорддрд▓рдм рдЯреНрд░реЛрд▓ рдЖрджрд┐ рд╕реЗ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдпрд╣ рди рд╕реЛрдЪреЗрдВ рдХрд┐ рдореИрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд╕рд╛рдорд╛рди рдХрд╛ рдмрд╛рд░-рдмрд╛рд░ рдЬрд╡рд╛рдм рджреЗрдХрд░ рдФрд░ рджреЛрд╣рд░рд╛рдХрд░ рдПрдХ рдЭрдЯрдХрд╛ рдмрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореИрдВ рд╕рджрд┐рдпреЛрдВ рд╕реЗ рдЕрдкрдиреА рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред рдорд╣рд╛рди! рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ _all_ рдереЛрдбрд╝рд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ... рдФрд░ рдпрд╣реА рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдШрд░ рдкрд░ рд╣рд┐рдЯ рд╣реЛред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕реНрд╡рд░реВрдкрдгред
(рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЗрд╕ рдЕрдВрдХ рдХреЗ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдХреА рддреНрд░реБрдЯрд┐ рджреЗрдЦреА рд╣реИ рдФрд░ рдЕрдм рдореИрдВ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛)
рдФрд░ рд╡рд╣ рдореЗрд░рд╛ _real_ рд▓рдВрдмрд╛ рдЦреЗрд▓ рд░рд╣рд╛ рд╣реИ :)
рдХреНрдпреВрдИрдбреА
(рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рдЗрддрдирд╛ рд╢рд░реНрдордирд╛рдХ ЁЯШК)
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ .. рдкреБрд░рд╛рдиреА рдпрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП ....
(рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЗрд╕ рдЕрдВрдХ рдХреЗ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдХреА рддреНрд░реБрдЯрд┐ рджреЗрдЦреА рд╣реИ рдФрд░ рдЕрдм рдореИрдВ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛)
рдореИрдВ рдЬрд╛рдирддреА рд╣реВрдБ! рд╡реИрд╕рд╛ рд╣реА!
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ (рдбреЗрд╡рд▓рдкрд░) рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ .. рдирдХрд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ рдирд╣реАрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ (рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ) рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдЖрд░ рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ (рдФрд░ рдЗрд╕рд▓рд┐рдП рдордЬрд╛рдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) ... рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИрдВред
рдХреНрдпрд╛?
рдХреНрдпрд╛ рдЖрдкрдиреЗ HttpMessageHandler рдХреЛ рднреА рджреЗрдЦрд╛ рд╣реИ? рдпрд╣ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рд╕рдЪрдореБрдЪ рдПрдХ рдПрдХрд▓ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдПрдХ HttpRequestMessage рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ HttpResponseMessage рджреЗрддрд╛ рд╣реИ - рд╕рднреА рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рдкрд░рд┐рд╡рд╣рди рдЬрдВрдХ рд╕реЗ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЖрдк рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдирдХрд▓реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЬреЛ рд╕рдВрджреЗрд╢ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ HttpClient рднреЗрдЬрд╛ рд╣реИ, рдФрд░ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрддреА рд╣реИ рд╡рд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдХреЛрдб рдПрдХ рдЬреЗрд╕рди рдмреЙрдбреА рд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣рд╛ рд╣реИ, рддреЛ рдмрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдЬреЗрд╕рди рдмреЙрдбреА рд▓реМрдЯрд╛рдПрдВ рдЬреЛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ 404 рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ 404 рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдмреБрдирд┐рдпрд╛рджреА рдирд╣реАрдВ рд╣реИред рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕реЗ HttpClient рдХреЗ рд▓рд┐рдП рдПрдХ ctor рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬреЗрдВред рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рддрд╛рд░ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдпрд╛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреА рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдорд╣рд╛рдХрд╛рд╡реНрдп рдзрд╛рдЧреЗ рдХрд╛ рдореБрдЦреНрдп рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ .. рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд┐рдЯрд╛ рд╣реИред
рдФрд░ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдЬреЛ рдмрддрд╛рдпрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдореБрдЦреНрдп рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЧрд▓рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкрд┐рдЯрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╕реАрдзреЗ рд▓реЗрдХрд┐рди рд╕рдореНрдорд╛рдирдкреВрд░реНрд╡рдХ рдХрд╣рддрд╛ рд╣реВрдВ) рдФрд░ рдпрд╣ рдорд╛рдВрдЧ рдХрд░рдирд╛ рдХрд┐ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрдЧ рдХреА рднрд░рдкрд╛рдИ рдХрд░реЗрдВ, рдЬреЛ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐ рдЖрдк рдЧрд▓рдд рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ HttpClient рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣реИрдВрдбрд▓рд░/рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдереЛрдбрд╛ рд╣реИред
рдХреНрдпрд╛?
рдХреНрдпрд╛ рдЖрдкрдиреЗ HttpMessageHandler рдХреЛ рднреА рджреЗрдЦрд╛ рд╣реИ?
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдирд╣реАрдВ, рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ:
var payloadData = await _httpClient.GetStringAsync("https://......");
рдЕрд░реНрде, HttpClient
рдкрд░ рдЙрдЬрд╛рдЧрд░ рддрд░реАрдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ _really_ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ :) рдпрд╛рдп! рддреЗрдЬ, рд╕рд░рд▓, рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреАрддреЛ!
рдареАрдХ рд╣реИ - рддреЛ рдЕрдм рдЗрд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ... рдФрд░ рдЕрдм рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ .. рдЬреЛ рд╣рдореЗрдВ HttpMessageHandler
рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдиреЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
рдлрд┐рд░ рд╕реЗ рдореИрдВ рдпрд╣ рдХрд╣рддрд╛ рд░рд╣рддрд╛ рд╣реВрдВ => HttpClient
(рдпрд╛рдиреА HMH
, рдЖрджрд┐) рдХреА рдирд▓рд╕рд╛рдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реАрдЦ рдПрдХ рдкрд┐рдЯрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдкрдиреЗ рд╡рд╣ рд╕реАрдЦ рд▓рд┐рдпрд╛ _ .. рд╣рд╛рдВ, рдлрд┐рд░ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдЖрджрд┐ ... рднрд▓реЗ рд╣реА рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рджреВрд░рд╕реНрде рдХреЙрд▓ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрд╝рд░реВрд░, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдЕрд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдХреГрдкрдпрд╛ - рдореБрдЭреЗ HMH
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
рдФрд░ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдЬреЛ рдмрддрд╛рдпрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдореБрдЦреНрдп рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЧрд▓рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рд╣рд╛рдБ - рд▓реЛрдЧ рдореБрдЭрд╕реЗ рдЕрд╕рд╣рдордд рд╣реИрдВред рдХреЛрдИ рдЬрд╛рдБрдЪ рдирд╣реАрдВред рд╕рд╛рде рд╣реА - рд▓реЛрдЧ рднреА рдореБрдЭрд╕реЗ рд╕рд╣рдордд рд╣реИрдВред рдлрд┐рд░ рд╕реЗ, рдХреЛрдИ рдЬрд╛рдВрдЪ рдирд╣реАрдВред
рдФрд░ _demanding_ рдХрд┐ HttpClient рдХреЛ рдкрд░реАрдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрдЧ рдХреА рдХреНрд╖рддрд┐рдкреВрд░реНрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐ рдЖрдк рдЧрд▓рдд рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдареАрдХ рд╣реИ - рдореИрдВ рдпрд╣рд╛рдВ рдЖрдкрд╕реЗ рд╕рдореНрдорд╛рдирдкреВрд░реНрд╡рдХ рдЕрд╕рд╣рдордд рд╣реВрдВ (рдЬреЛ рдареАрдХ рд╣реИ)ред рдлрд┐рд░ рд╕реЗ, рдЕрд▓рдЧ рд░рд╛рдпред
рд▓реЗрдХрд┐рди рд╕рд░рд╕рд▓реАред рдпрд╣ рд╕рд┐рд▓рд╕рд┐рд▓рд╛ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓рд╛ рдЖ рд░рд╣рд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рддрдХ рдЖрдЧреЗ рдмрдврд╝ рдЪреБрдХрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдХрд╣рд╛ рдореЗрд░реА рдмрд╛рдд, рдХреБрдЫ рд▓реЛрдЧ рдХрд╣рддреЗ рд╣реИрдВ рд╣рд╛рдБ! рдХреБрдЫ рдиреЗ рдХрд╣рд╛ рдирд╣реАрдВ! рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдмрд╕ ... рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде рд▓реБрдврд╝рдХ рдЧрдпрд╛ рд╣реВрдВред
рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреА рдЯреНрд░реЗрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВ рдПрдХ рдмреБрд░рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдХрдареЛрд░ рдпрд╛ рдорддрд▓рдмреА рдирд╣реАрдВ рд▓рдЧрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╕рд┐рд░реНрдл рдореИрдВ рд╡реНрдпрдХреНрдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдореИрдВрдиреЗ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рджреВрд╕рд░реЛрдВ рдиреЗ рднреА рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ред рдмрд╕ рдЗрддрдирд╛ рд╣реАред
рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╣рдд рдирд╣реАрдВ рд╣реВрдВред рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдПрдХ рд╣реА рд░рд╛рдп рдХреЗ рд╕рд╛рде рдХреВрдж рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдирдХрд▓реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд╛рдХрдИ рдЕрдЪреНрдЫреЗ рдЕрдВрдХ рдмрдирд╛рдП рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдмреИрда рдЧрдпрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЪреБрдиреМрддреА рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЕрдВрддрддрдГ рдореИрдВ рдЙрд╕реА рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрдпрд╛ рдЬреЛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдирдХрд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдЪреАрдЬ рд╣реИ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╡реНрдпрд░реНрде рдЕрднреНрдпрд╛рд╕ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЬреАрд╡рди рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рднреА рдЖрдЧреЗ рдмрдврд╝ рдЧрдпрд╛ рд╣реВрдВред рдореИрдВ рдмрд╕ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдЕрдВрддрддрдГ рдЦреБрдж рдХреЛ рдПрдХ рд╡рд┐рд░рд╛рдо рджреЗрдВрдЧреЗ рдФрд░ рдЬреЛ рд╣реИ рдЙрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓реЗ рд▓реЗрдВрдЧреЗред
рд╕реНрд╡рдЧрдд рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ:
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдирд╣реАрдВ, рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ:
рд╡рд░ рдкреЗрд▓реЛрдбрдбреЗрдЯрд╛ = рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ _httpClient.GetStringAsync("https://......");
рдЕрд░реНрде, рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЙрдЬрд╛рдЧрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рд╣реИрдВ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИрдВ :) рдпрд╛рдп! рддреЗрдЬрд╝, >рд╕рд░рд▓, рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреАрддреЗрдВ!
рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ SOLID рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡реИрд╕реЗ рднреА рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИред рдЖрдИрдПрдордУ рдХреНрд▓рд╛рдЗрдВрдЯ, рдЕрдиреБрд░реЛрдз, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 3 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпрд╛рдВ рд╣реИрдВред рдореИрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рддрдВрдЧ рдпреБрдЧреНрдорди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ HttpResponseMessage рдХреЗ рдХреБрдЫ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрдврд╝рдиреЗ рдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде, "рд╕рд░рд▓" рдХрднреА рднреА "рд╕рд░рд▓" рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдмреАрдмреАрдУрдПрдо рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рд╣реИ :)
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд░реЗрдкреЛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ https://github.com/dotnet/designs/issues/9 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдпрд╛ https://github.com/dotnet/designs рдореЗрдВ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред
рдзрдиреНрдпрд╡рд╛рджред
рд╢рд╛рдпрдж рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдХреЗ рдиреАрдЪреЗ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдЬрд┐рдпреЛрд▓реЛрдХреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕рдлреЙрд░рдЯреЗрд╕реНрдЯ: рдЬрд┐рдпреЛрд▓реЛрдХреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕, IGeoLocationService
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ GeoLocationServiceForTest (рдХреБрдЫ: рдХреБрдЫ, HttpClient httpClient): рдЖрдзрд╛рд░ (рдХреБрдЫ)
{
рдЖрдзрд╛рд░._httpClient = httpClient;
}
}
рдореИрдВ @richardszalay рдХреЗ MockHttp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рдкреНрдд рд╣реБрдЖред
рдзрдиреНрдпрд╡рд╛рдж, рд░рд┐рдЪрд░реНрдб, рдЖрдкрдиреЗ рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛рдпрд╛!
рдареАрдХ рд╣реИ, рдореИрдВ рдмрд┐рдирд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд╛рд▓реЗ HttpClient
рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди HttpMessageHandler
рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХрдХреНрд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдХреНрдпреЛрдВрдХрд┐ SendAsync
рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ рдмрд╕ рдмреЗрдХрд╛рд░ рд╣реИред
рдореИрдВ NSubstitute рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
var httpMessageHandler =
Substitute.For<HttpMessageHandler>(); // cannot be mocked, not virtual nor interfaced
httpMessageHandler.SendAsync(message, cancellationToken)
.Return(whatever); // doesn't compile, it's protected
var httpClient = new HttpClient(httpMessageHandler)
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдирдорд╕реНрддреЗ @SidharthNabar - рдореЗрд░реЗ рдореБрджреНрджреЗ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рднреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред
рддреБрдордиреЗ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ :)
рдпрд╣ рдЭреВрдордиреЗ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдмрдбрд╝рд╛ рдиреГрддреНрдп рд╣реИ, рдмрд╕ рдореЗрд░рд╛ рдЕрд╕рд▓реА рдХреЛрдб рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ _рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд╣рд┐рдЯ рди рдХрд░реЗрдВ_ред
рдореИрдВрдиреЗ рдПрдХ HttpClient.Helpers repo рдФрд░ nuget рдкреИрдХреЗрдЬ рднреА рдмрдирд╛рдпрд╛ рд╣реИ .. рдмрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП! рдкрд░рд┐рджреГрд╢реНрдп рдХреА рддрд░рд╣ рд╣реИрдкреНрдкреА рдкрде рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдПрдВрдбрдкреЙрдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдЕрдкрд╡рд╛рдж ...
рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ -> рдХреНрдпрд╛ рд╣рдо рдпрд╣ рд╕рдм рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ ... рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рд░реНрдл рдПрдХ рдирдХрд▓реА рд╡рд┐рдзрд┐?
рдореИрдВ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ рдФрд░ рд╕рдордЭрд╛рдКрдВрдЧрд╛ ..
рд▓рдХреНрд╖реНрдп: рдЗрдВрдЯрд░рд╡реЗрдм рд╕реЗ рдХреБрдЫ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
рдЖрдЗрдП рджреЛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрджрд┐ рдпрд╣ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реИ):
рдореЗрд░рд╛ рдХреЛрдб рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ ...
рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ
рд╡рд╛рд╣! рдХрд┐рдпрд╛ рд╣реБрдЖред
рдареАрдХ рд╣реИ, рдЕрдм рд╡рд░реНрддрдорд╛рди рддрд░реАрдХреЗ рд╕реЗ...
рд▓реЗрдХрд┐рди рджрд░реНрдж рдЕрдм рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрд▓рд╛рд╕ рдХрд░рдиреА рдкрдбрд╝ рд░рд╣реА рд╣реИред рддреБрдордиреЗ рдЕрдм рдореБрдЭреЗ рдЪреЛрдЯ рдкрд╣реБрдВрдЪрд╛рдИ рд╣реИред
рдФрд░ рдпрд╣ рдХрдХреНрд╖рд╛ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЬрдм рддрдХ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХрд╛рдзрд┐рдХ
GetAsync calls
(рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдПрдХрд╛рдзрд┐рдХ рд╣реИрдВрдбрд▓рд░ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?) -рдпрд╛- рдПрдХ рд╣реА рд╕реЗрд╡рд╛ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ httpClientsред рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рд╣рдо рд╣реИрдВрдбрд▓рд░ рдХрд╛Dispose
рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рддрд░реНрдХ рдХреЗ рдПрдХ рд╣реА рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЬреЛ рдПрдХ рд╕реАрдЯреАрдЖрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ)?рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдЗрддрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ..
рд╕рд╛рдл рд╕рд╛рдл рд╕рд╛рдл :)
рдлрд┐рд░ - рдЕрдЧрд▓рд╛ рдмрд┐рдЯ рд╣реИ: рдЦреЛрдЬ рдпреЛрдЧреНрдпрддрд╛
рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░
MS.Net.Http.HttpClient
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рддреЛ рдПрдкреАрдЖрдИ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдерд╛: +1: рдареАрдХ рд╣реИ - рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░реЗрдВ .. рд╕рд░рд▓ ...... рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ .... рдФрд░ рдЕрдм рдореБрдЭреЗ
HttpClientHandlers
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИ? рдЙрдо рдХреНрдпреЛрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдХрд╡рд░ рдХреЗ рдиреАрдЪреЗ рдЫреБрдкрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдореБрдЭреЗ рдЗрд╕ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рддреЛ рдЬреНрдпрд╛рджрд╛ рд╣реИ! рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдореБрдЭреЗ рдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреБрдЫ рдкреНрд▓рдВрдмрд┐рдВрдЧ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП ... рдЬреЛ рджрд░реНрдж рд╣реЛрддрд╛ рд╣реИ: рд░реЛрдирд╛:рдпрд╣ рд╕рдм рдЖрдИрдПрдордУ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред
рдореЗрд░реА рдорджрдж рдХрд░реЗрдВ Microsoft - рдЖрдк рд╣реА рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдЖрд╢рд╛ рд╣реИрдВред