HttpClient 401 在第 1、3、5 次请求时未经授权,但在调用 ASP.NET Web API 时在第 2、4、6 次成功

HttpClient 401 unauthorized at 1st, 3rd, 5th requests but successful at 2nd, 4th, 6th when calling ASP.NET Web API

我在使用 httpclient(控制台程序)调用 web api 时遇到一个问题

Program.cs

static void Main(string[] args)
{
    var token = GlobalVariables.GetAccessToken();
    Console.WriteLine("================================");
    Console.WriteLine("TOKEN");
    Console.WriteLine($"Token : {token.Token}");
    Console.WriteLine($"Expires : {token.ExpiresIn}");
    Console.WriteLine("================================");
    Console.WriteLine("1");
    Console.WriteLine("================================");
    CallApiEndpoint(ApiUrl, token.Token);
    Console.WriteLine("================================");
    Console.WriteLine("2");
    Console.WriteLine("================================");
    CallApiEndpoint(ApiUrl, token.Token);
    Console.WriteLine("================================");
    Console.WriteLine("3");
    Console.WriteLine("================================");
    CallApiEndpoint(ApiUrl, token.Token);
    Console.WriteLine("================================");
    Console.WriteLine("4");
    Console.WriteLine("================================");
    CallApiEndpoint(ApiUrl, token.Token);
    Console.WriteLine("================================");
    Console.WriteLine("5");
    Console.WriteLine("================================");
    CallApiEndpoint(ApiUrl, token.Token);
    Console.WriteLine("================================");
    Console.WriteLine("6");
    Console.WriteLine("================================");
    CallApiEndpoint(ApiUrl, token.Token);
    Console.WriteLine("================================");

    Console.Read();
}

static void CallApiEndpoint(string url, string token)
{
    using (var httpClient = new HttpClient())
    {
        httpClient.BaseAddress = new Uri(BaseUrl);
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
        var response = httpClient.GetAsync(url).Result;

        if (response.IsSuccessStatusCode)
        {
            Console.WriteLine("Success");
        }
        else
        {
            Console.WriteLine(response.StatusCode);
        }
    }
}

Startup.cs

public void Configuration(IAppBuilder app)
{
    UserManagerFactory = () => new UserManager<User>();
    PublicClientId = "self";

    OAuthOptions = new OAuthAuthorizationServerOptions
    {
        TokenEndpointPath = new PathString("/Token"),
        Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
        AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
        AllowInsecureHttp = true
    };

    app.UseOAuthBearerTokens(OAuthOptions);
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    app.UseCookieAuthentication(new CookieAuthenticationOptions());
}

回应

提前致谢,

经过数周的调查,我终于发现 401 unauthorized 是由于 Load Balancer 在基础设施级别 (IIS) 造成的。

所以我只是把 MachineKey 放在 web.config

希望对大家有所帮助。