相关疑难解决方法(0)

HTTPWebRequest.GetResponse()通过透明代理验证请求失败

我们正在使用这些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标头(这是正确).然后它接收剩余的初始回复并因协议错误而失败.

Wireshark捕获

HTTPWebRequest尽管如此,client()并没有干净地关闭连接,这似乎很奇怪.

当代理未使用时(非端口80或内部流量),请求全部按预期工作.如果没有身份验证,它也可以正常工作,因为它只生成单个请求.

我已经将问题代码减少到最小并使用MSDN示例重现它,但是有人知道这是已知问题还是我们(.NET或Squid)配置中的问题?

c# httpwebrequest http-proxy .net-2.0 transparentproxy

13
推荐指数
1
解决办法
6366
查看次数

.NET WebClient首先发送没有身份验证的请求

我正在使用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?

.net c# security webclient digest-authentication

8
推荐指数
1
解决办法
6741
查看次数

NetworkCredential UseDefaultCredentials无效

我们编写了一个代码,用于调用具有域凭据的服务.现在域名已更改,并计划使用默认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 c# asp.net web-services asmx

8
推荐指数
1
解决办法
2259
查看次数

在NetworkCredentials中提供用户名和密码时,.net中的HttpClient会发出2个请求

当使用.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)

.net c#

7
推荐指数
2
解决办法
3851
查看次数