2011-02-04 165 views
1

尝试使用自定义基本验证模块similar to this时出现问题。客户端使用HttpWebRequest类。通过SSL发送请求时无法发布文件数据

客户端运行下面​​的代码:

void uploadFile(string serverUrl, string filePath) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest. 
     Create(serverUrl); 
    CredentialCache cache = new CredentialCache(); 
    cache.Add(new Uri(serverUrl), "Basic", new NetworkCredential("User", "pass")); 
    request.Credentials = cache; 
    request.Method = "POST"; 
    request.ContentType = "application/octet-stream"; 
    request.Timeout = 60000; 
    request.KeepAlive = true; 

    using(BinaryReader reader = new BinaryReader( 
     File.OpenRead(filePath))) { 

     request.ContentLength = reader.BaseStream.Length; 
     using(Stream stream = request.GetRequestStream()) { 
      byte[] buffer = new byte[1024]; 
      while(true) { 
       int bytesRead = reader.Read(buffer, 0, buffer.Length); 
       if(bytesRead == 0) { 
        break; 
       } 
       stream.Write(buffer, 0, bytesRead); 
      } 
     } 
    } 

    HttpWebResponse result = (HttpWebResponse)request.GetResponse(); 
    //handle result - not relevant 
} 

如果一个URI开始http://创建请求它工作正常 - 一个请求到达服务器,认证模块传递请求,它回复WWW-Authenticate,请求重复现在与认证参数,模块验证它,并进一步传递。

如果为从https://开始的URI创建请求,则不起作用。初始请求获取到模块和模块WWW-Authenticate

void ReplyWithAuthHeader() 
{ 
    HttpContext currentContext = HttpContext.Current; 
    context.Response.StatusCode = 401; 
    context.Response.AddHeader("WWW-Authenticate", 
     String.Format("Basic realm=\"{0}\"", "myname.mycompany.com")); 
} 

的一个例外是在客户机抛出带有“无法将数据写入传输连接回复:一个已建立的连接在主机中的软件放弃机。”文本。

我试图System.Net tracing,发现在客户端发送回来下面的头在初始请求后:

Date: Fri, 04 Feb 2011 12:15:04 GMT 
Server: Microsoft-IIS/5.1 
X-Powered-By: ASP.NET 

而当URI开始http://客户端收到以下内容:

Content-Length: 1894 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Date: Fri, 04 Feb 2011 12:12:11 GMT 
Server: Microsoft-IIS/5.1 
WWW-Authenticate: Basic realm="myname.mycompany.com" 
X-AspNet-Version: 2.0.50727 
X-Powered-By: ASP.NET 

所以很明显,WWW-Authenticate响应会被吞噬,并且不会到达客户端。

此外,如果我排除将文件数据写入请求的代码,它也可以进行身份​​验证。

我该如何解决这个问题?我如何使WWW-Authenticate响应得到客户端?

回答

0

什么是从服务器返回的http状态码? 服务器的证书是否有效? 你可以发布堆栈跟踪吗?

尝试在客户端上禁用防火墙和其他网络工具,如fiddler等。 也尝试将KeepAlive属性设置为false。

相关问题