Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在尝试使用HttpClient检索AccesToken时,我遇到了一个错误_C#_.net_Linux_.net Core_Dotnet Httpclient - Fatal编程技术网

C# 在尝试使用HttpClient检索AccesToken时,我遇到了一个错误

C# 在尝试使用HttpClient检索AccesToken时,我遇到了一个错误,c#,.net,linux,.net-core,dotnet-httpclient,C#,.net,Linux,.net Core,Dotnet Httpclient,尝试使用HttpClient从windows服务器检索Acces令牌时,出现错误: “GSSAPI操作失败,出现错误-提供的状态代码无效(SPNEGO找不到协商机制)。” private readonly HttpClient client=new HttpClientHandler(){UseDefaultCredentials=true,AllowAutoRedirect=true}{Timeout=TimeSpan.FromSeconds(5)}; 公共异步任务GetAuthenticat

尝试使用HttpClient从windows服务器检索Acces令牌时,出现错误:

“GSSAPI操作失败,出现错误-提供的状态代码无效(SPNEGO找不到协商机制)。”

private readonly HttpClient client=new HttpClientHandler(){UseDefaultCredentials=true,AllowAutoRedirect=true}{Timeout=TimeSpan.FromSeconds(5)};
公共异步任务GetAuthenticationToken(字符串accessBrokerHost)
{
尝试
{
var response=await client.sendaync(新的HttpRequestMessage(HttpMethod.Get,$“{accessBrokerHost}/Token”)).ConfigureAwait(false);
//accessBrokerHost是在windows服务器内部创建的HTTP SPN
如果(!response.issucessStatusCode)
{                    
抛出新的BrokerNotAvailableException();
}
返回wait response.Content.ReadAsAsync().configurewait(false);
}            
}
system.ComponentModel.win32Exception正在引发,因为GSSAPI操作失败,出现错误-提供了无效的状态代码(SPNEGO找不到协商机制)


上面的代码在windows中运行良好,但在Linux中运行不好(我使用的是LinuxMint)。据我所知,它指的是一个试图使用Kerberos但没有Kerberos票证用于Linux身份验证的问题。

最后,我找到了这个问题的解决方案

解决方案1:

第一步。根据,您应该添加

 AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
第二步。由于UseDefaultCredentials=true在这里不起作用,您需要手动将网络凭据传递给HttpClient,如下所示

HttpClient client = new HttpClient(new HttpClientHandler{Credentials = new NetworkCredential("UserName" "Password", "Domain")}
第三步。您应该将HttpRequestMessage版本更改为

HttpVersion.Version11


解决方案2:您还可以通过将整个应用程序转换为NetcoreApp3.0来解决此问题。最后,我找到了解决此问题的方法

解决方案1:

第一步。根据,您应该添加

 AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
第二步。由于UseDefaultCredentials=true在这里不起作用,您需要手动将网络凭据传递给HttpClient,如下所示

HttpClient client = new HttpClient(new HttpClientHandler{Credentials = new NetworkCredential("UserName" "Password", "Domain")}
第三步。您应该将HttpRequestMessage版本更改为

HttpVersion.Version11


解决方案2:您还可以通过将整个应用程序转换为NetcoreApp3.0来解决此问题

谢谢@dustinos3的编辑。我很感激。根据这个,这似乎是一年前的一个bug,你用的是什么版本?也许使用最新版本可以为您修复。谢谢您的回复,我正在使用netcoreapp2.2。我看过很多与这个问题相关的东西,包括你建议的链接,但我不太明白。我可能不是c#方面的专家,但我很擅长谷歌搜索,哈哈,而且因为错误提到win32,它不是linux的一部分,我想这不正常,当您不在windows中时,似乎有人通过阻止SocketShtpHandler重写HttpHandler解决了相同的问题,此链接对此进行了更好的解释。谢谢你,女士,我已经试过了,但是没有用。得到相同的错误。谢谢@dustinos3的编辑。我很感激。根据这个,这似乎是一年前的一个bug,你用的是什么版本?也许使用最新版本可以为您修复。谢谢您的回复,我正在使用netcoreapp2.2。我看过很多与这个问题相关的东西,包括你建议的链接,但我不太明白。我可能不是c#方面的专家,但我很擅长谷歌搜索,哈哈,而且因为错误提到win32,它不是linux的一部分,我想这不正常,当您不在windows中时,似乎有人通过阻止SocketShtpHandler重写HttpHandler解决了相同的问题,此链接对此进行了更好的解释。谢谢你,女士,我已经试过了,但是没有用。得到相同的错误。