C# Web API HttpClient返回“;“未经授权”;状态码

C# Web API HttpClient返回“;“未经授权”;状态码,c#,azure,asp.net-web-api,dotnet-httpclient,C#,Azure,Asp.net Web Api,Dotnet Httpclient,我在WinForms应用程序中使用HttpClient时有一种奇怪的行为(试图连接到Azure网站托管的Web API) 简单来说: 我的客户有时能联系,有时不能 当他们无法访问时,如果我转到浏览器并加载url(http://xxx.azurewebsites.net/api/entity),然后返回到客户端并尝试连接,一切正常 我遇到的问题发生在一个公司网络上(不确定这是否相关,但我想我应该提及) 只有在我尝试先通过浏览器进行连接后,什么才能导致连接被授权 编辑: 这是我的密码: pu

我在WinForms应用程序中使用
HttpClient
时有一种奇怪的行为(试图连接到Azure网站托管的Web API)

简单来说:

  • 我的客户有时能联系,有时不能
  • 当他们无法访问时,如果我转到浏览器并加载url(
    http://xxx.azurewebsites.net/api/entity
    ),然后返回到客户端并尝试连接,一切正常
  • 我遇到的问题发生在一个公司网络上(不确定这是否相关,但我想我应该提及)
  • 只有在我尝试先通过浏览器进行连接后,什么才能导致连接被授权

    编辑:

    这是我的密码:

        public static User GetUser()
        {
            HttpClient client = StaticFunctions.GetHttpClient();
            string parameters = "username=username&password=password"
            HttpResponseMessage response = client.GetAsync("api/user?" + parameters).Result; 
            if (response.IsSuccessStatusCode)
            {
                var user = response.Content.ReadAsAsync<User>().Result;
                return user;
            }
            else
            {
                return null;
            }
        }
    
        public static HttpClient GetHttpClient()
        {
            NetworkCredential credentials = null;
            if (GlobalVariables.CurrentUser != null)
            {
                credentials = new NetworkCredential(GlobalVariables.CurrentUser.UserName, GlobalVariables.CurrentUser.Password);
            }
            HttpClientHandler handler = new HttpClientHandler();
    
            handler.UseDefaultCredentials = false;
            handler.Credentials = credentials;
            HttpClient client = new HttpClient(handler);
            client.BaseAddress = new Uri(PublicClasses.GlobalVariables.BaseUriString);
            client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));
            return client;
        }
    
    公共静态用户GetUser()
    {
    HttpClient=StaticFunctions.GetHttpClient();
    字符串参数=“用户名=用户名&密码=密码”
    HttpResponseMessageResponse=client.GetAsync(“api/user?”+参数)。结果;
    if(响应。IsSuccessStatusCode)
    {
    var user=response.Content.ReadAsAsync().Result;
    返回用户;
    }
    其他的
    {
    返回null;
    }
    }
    公共静态HttpClient GetHttpClient()
    {
    NetworkCredential凭据=空;
    if(GlobalVariables.CurrentUser!=null)
    {
    凭据=新网络凭据(GlobalVariables.CurrentUser.UserName,GlobalVariables.CurrentUser.Password);
    }
    HttpClientHandler handler=新的HttpClientHandler();
    handler.UseDefaultCredentials=false;
    handler.Credentials=凭证;
    HttpClient=新的HttpClient(处理程序);
    client.BaseAddress=新Uri(PublicClasses.GlobalVariables.BaseUriString);
    client.DefaultRequestHeaders.Accept.Add(
    新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
    返回客户;
    }
    
    你能分享一些代码吗?我以前也遇到过类似的问题,在某些应用程序运行之前,我需要打开浏览器。我会说,请检查你的连接设置,看看它是否设置为拨号连接。尽管如此。。这是一个模糊的猜测,因为您没有显示任何代码:-)不幸的是,目前没有显示我的代码(今晚将显示),但同时,您所说的“查看是否设置为拨号连接”是什么意思?您的基础架构是否需要某种类型的客户端证书?@PeterRitchie,我不太清楚,但我不时注意到的一件事是,HttpClient中的URL有时会通过使用一些我不理解的字母/数字进行预挂来修改……我想知道这是否与客户端证书要求有关(我对此一无所知)一些我不了解的基础架构代理或类似的东西…我想在去IT部门之前发现问题,因为IT部门有很多更重要的项目。