OData服务的Windows身份验证返回“;401-未经授权;在C#应用程序中,但在浏览器中工作

OData服务的Windows身份验证返回“;401-未经授权;在C#应用程序中,但在浏览器中工作,c#,http,wcf-data-services,windows-authentication,ntlm,C#,Http,Wcf Data Services,Windows Authentication,Ntlm,我正在尝试向我的C#应用程序添加功能,以测试与OData服务的连接,该服务仅通过Windows身份验证进行保护。以下代码块是我用来执行此测试的代码: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(SERVICE_NAME)); CredentialCache myCache = new CredentialCache(); myCache.Add(new Uri(SERVICE_NAME), "Negoti

我正在尝试向我的C#应用程序添加功能,以测试与OData服务的连接,该服务仅通过Windows身份验证进行保护。以下代码块是我用来执行此测试的代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(SERVICE_NAME));
CredentialCache myCache = new CredentialCache();

myCache.Add(new Uri(SERVICE_NAME), "Negotiate", new NetworkCredential(user, password));
resolver.Credentials = myCache;

//  Do a simple request
request.Credentials = myCache;
request.PreAuthenticate = true;
request.KeepAlive = true;
request.AllowAutoRedirect = true;
request.CookieContainer = new CookieContainer();
object response = request.GetResponse();  // This is where the exception is thrown
当我运行上面的代码时,我收到了前面提到的401-Unauthorized错误。但是,当我运行Fiddler2时,代码运行良好。所以我用Wireshark代替。此外,该服务在我的浏览器(Chrome)中运行得非常完美,如果我使用Wireshark来比较验证的HTTP请求/响应,我会发现它们几乎完全相同,只是在Chrome中我有:Accept、User Agent、Accept Encoding和Accept Language头,而我的C#app没有这些头。唯一的另一个区别是,我的C#应用程序在NTLM标题中设置了“协商封条”标志,而Chrome没有设置此标志

尽管存在这些差异,在C#app中,身份验证阶段似乎工作正常,直到服务返回302-重定向,此时应用程序尝试获取新重定向的URI,该URI再次返回401(当Chrome执行类似的GET时,它接收HTTP 200-OK,并以愉快的方式继续)

那么,你知道这是什么原因吗?服务有问题吗?还是我的密码

非常感谢!
-埃里克

好的,经过整整两天的研究,我找到了答案。上面代码中的第3行使用的是服务的完整URI(“…/Northwind/Northwind.svc”),当请求被重定向时,凭据不再应用于新URI。解决方案是只传入URI的开始部分(“…”)。我犯了愚蠢的错误