我们正在使用这些HTTPWebRequest对象向我们的应用程序发出HTTP请求,当请求需要身份验证并且存在透明代理(Squid 3.1.10)时,我们遇到了问题.
string url = "http://www.icode.co.uk/test/auth.php";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
MessageBox.Show(reader.ReadToEnd());
reader.Close();
stream.Close();
response.Close();
Run Code Online (Sandbox Code Playgroud)
我们的原始代码使用了WebClient类,它表现出同样的问题.
第一次运行此代码时,它会正确显示结果.当代码第二次运行时,它在以下GetResponse()行中失败:
System.Net.WebException was unhandled
Message="The server committed a protocol violation. Section=ResponseStatusLine"
Source="System"
StackTrace:
at System.Net.HttpWebRequest.GetResponse()
at Dummy.DummyForm.button1_Click(Object sender, EventArgs e) in H:\Trial\Dummy\DummyForm.cs:line 42
at ...
Run Code Online (Sandbox Code Playgroud)
在Windows 7上,重新启动进程会使其恢复并运行一次,但Server 2003需要完全重新启动.
查看网络捕获,两个请求与开始时相同,发送初始未经身份验证的请求并且服务器回复,但失败请求在初始回复的中间发送第二个经过身份验证的请求,就好像它忽略了Content-Length标头(这是正确).然后它接收剩余的初始回复并因协议错误而失败.

HTTPWebRequest尽管如此,client()并没有干净地关闭连接,这似乎很奇怪.
当代理未使用时(非端口80或内部流量),请求全部按预期工作.如果没有身份验证,它也可以正常工作,因为它只生成单个请求.
我已经将问题代码减少到最小并使用MSDN示例重现它,但是有人知道这是已知问题还是我们(.NET或Squid)配置中的问题?
我正在使用Asp.net web api构建Web服务,我必须从AXIS IP Camera获取图像.但是,摄像机使用摘要式身份验证.所以我的C#代码看起来像这样:
WebClient webClient = new WebClient();
webClient.UseDefaultCredentials = true;
webClient.Credentials = new NetworkCredential("***", "***");
byte[] imageStream = webClient.DownloadData("http://192.168.0.90/axis-cgi/jpg/image.cgi");
Run Code Online (Sandbox Code Playgroud)
这一切都有效,但在查看Fiddler时,我发现客户端在没有身份验证的情况下发送了一个请求,并返回401错误.之后,它发送具有摘要安全性的那个.
我在这里找到了一个带有手动凭证注入的解决方案:
http://kristofmattei.be/2013/02/20/webclient-not-sending-credentials-heres-why/
但这看起来不错.它使用基本身份验证,我真的不想要,看起来有点不专业.
有没有办法立即发送签名的请求或这是如何工作的,因为我注意到相机在第一个请求中返回nonce?
我们编写了一个代码,用于调用具有域凭据的服务.现在域名已更改,并计划使用默认Windows帐户
所以我试图通过配置重置asmx webservice的网络凭据.我创建了一个SoapExtentsion类,并尝试覆盖它,即使它执行该行.但它永远不会被应用,并且总是以下现有代码获胜
实际代码
EmployeeService prxy = new EmployeeService();
prxy.Credentials = new System.Net.NetworkCredential("MyAccount", "pwd", "MyDomain");
//prxy.UseDefaultCredentials = true;// It works but we dont want code change
prxy.GetEmployee(empId);
Run Code Online (Sandbox Code Playgroud)
新代码/配置仅更改
计划通过额外的dll和配置更改注入.因此,现在不需要/禁止原始代码中的代码更改
public class WindowsDefCredSoapExtn : SoapExtension
{
public override object GetInitializer(Type serviceType)
{
return "";
}
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return "";
}
public override void Initialize(object initializer)
{
//throw new NotImplementedException();
}
public override void ProcessMessage(SoapMessage message)
{
if (message is SoapClientMessage)
{
if (message.Stage == SoapMessageStage.BeforeSerialize) …Run Code Online (Sandbox Code Playgroud) 当使用.net 4.5中的HttpClient进行基本身份验证时,我发现它发出了2个请求.
第一个失败,HTTP/1.1 401 Unauthorized,然后重新发送我们获得HTTP/1.1 200 OK的请求.
关于如何阻止它这样做的任何想法?
var credential = new NetworkCredential
{
UserName = username,
Password = password
}
var httpClientHandler = new System.Net.Http.HttpClientHandler
{
Credentials = credential
};
httpClient = new HttpClient(httpClientHandler, true)
{
BaseAddress = address
};
Run Code Online (Sandbox Code Playgroud) c# ×4
.net ×3
.net-2.0 ×1
asmx ×1
asp.net ×1
http-proxy ×1
security ×1
web-services ×1
webclient ×1