Runtime: рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП httpClient.GetAsync(..) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрд╣рд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдордИ 2015  ┬╖  157рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/runtime

System.Net.Http рдЕрдм рд░реЗрдкреЛ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :smile: :tada: :balloon:

рдЬрдм рднреА рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ => рдореЗрд░реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрдд рдмрд┐рдВрджреБ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА рд╣рд┐рдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╕рджрд┐рдпреЛрдВ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ @davidfowl рд╕реЗ рдкреВрдЫрд╛ рдерд╛ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЙрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕реЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрджреНрдзреГрдд рдирд╣реАрдВ рдХрд░рддрд╛ - рд▓реЗрдХрд┐рди рдЙрд╕рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ рдПрдХ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ (рдпрд╛рдиреА HttpClientHandler ) рдХреЛ рдирдХрд▓реА рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрд╕реЗ рддрд╛рд░ рджреЗрдВ, рдЖрджрд┐ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HttpClient.Helpers рдирд╛рдордХ рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред

рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдпрд╣ _very_ рдЧрдиреНрджрд╛ рдФрд░ .. рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВ рдЬрд┐рд╕реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдореЗрд░реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ? рдЬреИрд╕реЗ .. рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд┐рд░реНрдл IHttpClient рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

Design Discussion area-System.Net.Http test enhancement

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирдорд╕реНрддреЗ @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);
    ...
}

рд╡рд╛рд╣! рдХрд┐рдпрд╛ рд╣реБрдЖред

рдареАрдХ рд╣реИ, рдЕрдм рд╡рд░реНрддрдорд╛рди рддрд░реАрдХреЗ рд╕реЗ...

  1. рдПрдХ рдирдпрд╛ рд╣реИрдВрдбрд▓рд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ - рд╣рд╛рдБ, рдПрдХ рдХреНрд▓рд╛рд╕!
  2. рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реЗрд╡рд╛ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ
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 - рдЖрдк рд╣реА рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдЖрд╢рд╛ рд╣реИрдВред

рд╕рднреА 157 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

HttpClient рдПрдХ рдЕрдиреНрдп HTTP рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдПрдХ рдЕрдореВрд░реНрдд рдкрд░рдд рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЖрдкрдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдпрддрд╛рддреНрдордХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрддрдиреА рд╣реА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред

рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, HttpClient рд╕реНрд╡рдпрдВ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдФрд░ "рдирдХрд▓реА" рдСрдмреНрдЬреЗрдХреНрдЯ рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ HttpMessageHandler рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ) рдЗрд╕реЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ рд╕рдорд╛рдзрд╛рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ?

@PureKrome - рдЗрд╕реЗ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЯрдХрд░рд╛рдП рдмрд┐рдирд╛ HttpClient рдХреЛ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ -

  1. HttpMessageHandler . рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдирдпрд╛ рд╣реИрдВрдбрд▓рд░ рд╡рд░реНрдЧ (рдЬреИрд╕реЗ FooHandler) рдмрдирд╛рдПрдВ
  2. рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ SendAsync рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░реЗрдВ - рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд╣рд┐рдЯ рди рдХрд░реЗрдВ/рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛/рдЖрджрд┐ рд▓реЙрдЧ рдХрд░реЗрдВред
  3. HttpClient рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдЗрд╕ FooHandler рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╕ рдХрд░реЗрдВ:
    рд╡рд░ рд╣реИрдВрдбрд▓рд░ = рдирдпрд╛ рдлреВрд╣реИрдВрдбрд▓рд░ ();
    var рдХреНрд▓рд╛рдЗрдВрдЯ = рдирдпрд╛ 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);
    ...
}

рд╡рд╛рд╣! рдХрд┐рдпрд╛ рд╣реБрдЖред

рдареАрдХ рд╣реИ, рдЕрдм рд╡рд░реНрддрдорд╛рди рддрд░реАрдХреЗ рд╕реЗ...

  1. рдПрдХ рдирдпрд╛ рд╣реИрдВрдбрд▓рд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ - рд╣рд╛рдБ, рдПрдХ рдХреНрд▓рд╛рд╕!
  2. рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реЗрд╡рд╛ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ
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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

  • рдкрд╣рд▓рд╛ рдПрдкреАрдЖрдИ рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕/рд╡рд░реНрдЪреБрдЕрд▓/рдЬреЛ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ .. рд▓реЗрдХрд┐рди рд╡рд┐рдзрд┐ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рджреВрд╕рд░рд╛ рдПрдкреАрдЖрдИ рдЬреЛ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ _integration point_ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП .. рдЙрдиреНрд╣реЗрдВ рдХреЛрдб рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЖрдИрдПрдордУред

рджреЗрдЦреЗрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдбреЗрд╡рд▓рдкрд░ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ _рдФрд░_ рдЦреБрд╢ рд░рд╣реЗрдВред

рдпрджрд┐ рдПрдкреАрдЖрдИ рдирдХрд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрднреА рдпрд╣ рдЖрдИрдПрдордУ рдирд╣реАрдВ рд╣реИ - рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ (рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛)

рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реБрджреНрдз рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╕реЗ рдирдХрд▓реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА - рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИред рд▓рдХреНрд╖реНрдп рдпреБрджреНрдз-рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдирдХрд▓реА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИ рдФрд░ рдЖрдк рдЬрд╛рддреЗ рд╣реИрдВред

@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 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдордЬрд╛рдХ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рд╛рдл рдЕрдореВрд░реНрдд рдкрд░рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдбрд┐рдХреВрдкреНрдб, рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдпреЛрдЧреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдХрд┐рдВрдЧ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЙрдкрд╣рд╛рд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:

  1. рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рдмреЛрдЭ рдмрдврд╝ рдЧрдпрд╛ (рдореЙрдХ рдмрдирд╛рдП рд░рдЦрдирд╛), рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рд▓рд╛рдЧрдд рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ
  2. рдЗрд╕ рдмрд╛рдд рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рд╕рдВрджреЗрд╢ рд╕реЗ рдЬреБрдбрд╝реА рд╕рд╛рдордЧреНрд░реА рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рд╕рд╛рдордЧреНрд░реА рд╕реНрдЯреНрд░реАрдо рдкрд░ Dispose рдкрд░ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЙрдХ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрдВрдЧреЗ)
  3. рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдореВрд░реНрдд рдкрд░рдд рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕рдЦреНрдд рдпреБрдЧреНрдорди, рдЬреЛ 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 рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдЗрдВрдЯрд░рдиреЗрдЯ рдЙрдбрд╝ рдЧрдпрд╛)

рдФрд░ рдЕрдм рдореИрдВ рдЙрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЬрдм 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 рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдИ рддреАрди рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛:

  • рдЕрдЧрд░ http рдЕрдиреБрд░реЛрдз рд╕рд╣реА METHOD . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ
  • рдЕрдЧрд░ http рдЕрдиреБрд░реЛрдз рдореЗрдВ URL . рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ
  • рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рдХрд╛рдп рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ json deserializer рдХреЗ рд╕рд╛рде deserialized рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдореЗрдВ рд╕рд┐рд░реНрдл 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
{
рдЯрд╛рд╕реНрдХGetSomeThingsValueAsync (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрдИрдбреА);
}

рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ 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 рдХрд╛рд░реНрдпGetSomeThingsValueAsync (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрдИрдбреА)
{
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 рд▓реМрдЯрд╛ рджрд┐рдпрд╛ред

Magic is Real

@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 рдЯреАрдо! рдмрд╕ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрдзрд╛рд░ рдХреЛ рдЫреВ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯреАрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреА рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рдПрдХ рдорд╣реАрдиреЗ + рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реИред

рд╢рд┐рд╡рд┐рд░ рдХреЗ рджреЛрдиреЛрдВ рдУрд░ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдВрджреБ рд╣реИрдВ - рд╕рднреА рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрдИрдПрдордУред

рдХреНрдпрд╛ рдЖрдк рд▓рдбрд╝рдХрд┐рдпреЛрдВ/рджреЛрд╕реНрддреЛрдВ рд╕реЗ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИрдВ?

рдЕрд░реНрдерд╛рддред

  1. рд╣рдо рдХреЙрдирд╡реЛ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдВрдЧреЗред рдЖрдкрдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛред рдпрд╣рд╛рдВ, рдХреЗрдХ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓реЗрдВ:
  2. рд╣рдордиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЪреАрдЬреЗрдВ рдпрд╣рд╛рдВ рд╡реНрдпрд╕реНрдд рд╣реИрдВ) _but_ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдХреА рддрд╛рд░реАрдЦ рдореЗрдВ рд╕реЛрдЪреЗрдВрдЧреЗ _ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд░рд┐рд▓реАрдЬ-рдЯреВ-рд╡реЗрдм (рдЖрд░рдЯреАрдбрдмреНрд▓реНрдпреВ) рдкрд░ рдЬрд╛рдПрдВред
  3. рджрд░рдЕрд╕рд▓, рд╣рдордиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ рдФрд░ рд╣рдо рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдирддрд╛ рдХреЛ рдЗрд╕реЗ рдЯрдЯреЛрд▓рдирд╛ рдереЛрдбрд╝рд╛ рджрд░реНрджрдирд╛рдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо XXXXXXXXX рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЯрд╛!

рдпрд╣ рднрд╛рдЧ 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 рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдХрд▓реА рд╕реЗрд╡рд╛ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдСрдЯреЛрд░реЗрд╕реНрдкреЛрдиреНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

image

image

рдЗрд╕ HttpClient рд╡рд░реНрдЧ рдХреА рдЗрдХрд╛рдИ-рдкрд░реАрдХреНрд╖рдг-рдХреНрд╖рдорддрд╛ рдкрд░ рдХреЛрдИ рдЕрджреНрдпрддрди? рдореИрдВ DeleteAsync рд╡рд┐рдзрд┐ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ Moq рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрдЪреБрдЕрд▓ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реИрдкрд░ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рд░рд┐рдЪрд░реНрдбреНрд╕рдЬрд╝рд╛рд▓реЗ рдХреЛ рд╡реЛрдЯ рджреЗрддрд╛ рд╣реВрдБредрдореЙрдХhttp!
рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИ! рд╕рд░рд▓ рдФрд░ рд╢рд╛рдирджрд╛рд░!

https://github.com/richardszalay/mockhttp

рд▓реЗрдХрд┐рди @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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ

  1. рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ HTTP рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред
  2. _Dummy_ HTTP рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЙрди рдШрдЯрдХреЛрдВ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ рдЬреЛ рдЙрдХреНрдд рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдмрд╛рдЙрдВрдб HTTP рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдореЗрд░реЗ рдШрдЯрдХ рдореЗрдВ 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)

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jchannon picture jchannon  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

v0l picture v0l  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nalywa picture nalywa  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

noahfalk picture noahfalk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

GitAntoinee picture GitAntoinee  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ