通过SSL发送请求时无法发布文件数据

时间:2011-02-04 12:37:49

标签: c# .net asp.net iis ssl

我在尝试使用自定义基本身份验证模块similar to this时遇到问题。客户端使用HttpWebRequest类。

客户端运行以下代码:

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
 }

如果为以http://开头的URI创建请求它可以正常工作 - 请求到达服务器,验证模块传递请求,它回复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响应发送给客户?

1 个答案:

答案 0 :(得分:0)

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

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