我们使用C#开发了一个WPF应用程序,并使用RestSharp与这样的简单Web服务进行通信:
Client = new RestClient(serviceUri.AbsoluteUri);
Client.Authenticator = new NtlmAuthenticator(SvcUserName, SvcPassword.GetString());
这一切都很有效,直到我们收到某些计算机上的电话(大多数工作),该应用无法连接到该服务。 用fiddler直接调用服务方法。然后我们提取了一个小的.net控制台应用程序并尝试使用RestSharp进行服务调用,并直接使用HttpWebRequest,然后再次使用401失败。 现在我们启用了System.Net跟踪并注意到了一些事情。在第一个401之后,这是正常的,故障机器产生这个日志:
System.Net信息:0:[4480]连接#3741682 - 已接收标头 { 连接:保持活力 内容长度:1293 内容类型:text / html 日期:星期一,2015年8月10日12:37:49 GMT 服务器:Microsoft-IIS / 8.0 WWW-Authenticate:谈判,NTLM X-Powered-By:ASP.NET }。 System.Net信息:0:[4480] ConnectStream#39451090 :: ConnectStream(缓冲1293字节。) System.Net信息:0:[4480]将HttpWebRequest#2383799与ConnectStream相关联#39451090 System.Net信息:0:[4480]将HttpWebRequest#2383799与HttpWebResponse相关联#19515494 System.Net信息:0:[4480]枚举安全包: System.Net信息:0:[4480]谈判 System.Net信息:0:[4480] NegoExtender System.Net信息:0:[4480] Kerberos System.Net信息:0:[4480] NTLM System.Net信息:0:[4480] Schannel System.Net信息:0:[4480] Microsoft统一安全协议提供程序 System.Net信息:0:[4480] WDigest System.Net信息:0:[4480] TSSSP System.Net信息:0:[4480] pku2u System.Net信息:0:[4480] CREDSSP
System.Net信息:0:[4480] AcquireCredentialsHandle(package = NTLM,intent = Outbound,authdata = 的(的String.Empty)\ CORP \ svc_account)
System.Net信息:0:[4480] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY,context =(null),targetName = HTTP / mysvc.mycorp.com,inFlags = Delegate,MutualAuth, 连接)System.Net信息:0:[4480] InitializeSecurityContext(In-Buffers count = 1,Out-Buffer length = 40, 返回代码= ContinueNeeded)。
工作机器产生此输出:
System.Net信息:0:[3432]连接#57733168 - Empfangene Statusleiste:Version = 1.1,StatusCode = 401,StatusDescription = Unauthorized。 System.Net信息:0:[3432]连接#57733168 - 标题 { 内容类型:text / html 服务器:Microsoft-IIS / 8.0 WWW-Authenticate:谈判,NTLM X-Powered-By:ASP.NET 日期:星期一,2015年8月10日15:15:11 GMT 内容长度:1293 wurden empfangen。 System.Net信息:0:[3432] ConnectStream#35016340 :: ConnectStream(Es Wurden 1293 Bytes gepuffert。) System.Net信息:0:[3432]将HttpWebRequest#64062224与ConnectStream相关联#35016340 System.Net信息:0:[3432]将HttpWebRequest#64062224与HttpWebResponse相关联#64254500 System.Net信息:0:[3432] Sicherheitspakete werden enumeriert: System.Net信息:0:[3432]谈判 System.Net信息:0:[3432] NegoExtender System.Net信息:0:[3432] Kerberos System.Net信息:0:[3432] NTLM System.Net信息:0:[3432] Schannel System.Net信息:0:[3432] Microsoft统一安全协议提供程序 System.Net信息:0:[3432] WDigest System.Net信息:0:[3432] TSSSP System.Net信息:0:[3432] pku2u System.Net信息:0:[3432] CREDSSP
System.Net信息:0:[3432] AcquireCredentialsHandle(package = 谈判,意图=出境,authdata = System.Net.SafeSspiAuthDataHandle) System.Net信息:0:[3432] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY,context =(null),targetName = HTTP / mysvc.mycorp.com,inFlags = Delegate,MutualAuth,Connection)
System.Net信息:0:[3432] InitializeSecurityContext(Anzahl von In-Buffers = 1,LängevonOut-Buffer = 40,zurückgegebenerCode= ContinueNeeded)。
我想知道故障机器上的某些配置是否会导致此问题。目前我不知道下一步该去哪儿。
更新: 这是我们简单测试工具的代码:
RestClient Client = new RestClient("https://mysvc.mycorp.com/service.svc");
Client.Authenticator = new NtlmAuthenticator("corp\\svc_account", "mypassword");
var request = new RestRequest("api/Method", Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddBody(new { Device_Key = "somestring" });
request.Timeout = 200000;
RestResponse response = (RestResponse)Client.Execute(request);
更新2: 我们现在已确认此问题仅发生在新安装的具有更新企业映像的win 7计算机上。几乎看起来在过去两个月中的一些更新与我们有关。
答案 0 :(得分:6)
这很疯狂:事实证明,只要我在Windows 7机器上安装了.net 4.5,WebRequest就可以了!我们认为,罪魁祸首是部署到所有客户端计算机的.NET 4.0 Framework的缺失补丁。 所以,修补你的机器:)