Не удается опубликовать данные файла при отправке запроса по SSL - PullRequest
1 голос
/ 04 февраля 2011

У меня проблемы при попытке использовать пользовательский базовый модуль аутентификации , аналогичный этому . Клиент использует 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
 }

Если запрос создан для URI, начинающегося с http://, он работает нормально - запрос достигает сервера, модуль аутентификации передает запрос, он отвечает WWW-Authenticate, запрос теперь повторяется с параметрами аутентификации, модуль проверяет его и он проходит дальше.

Если запрос создан для URI, начинающегося с https://, он не работает. Первоначальный запрос поступает в модуль, и модуль отвечает с 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 и обнаружил, что после отправки первоначального запроса клиент получает следующий заголовок:

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 голосов
/ 26 февраля 2011

Какие коды статуса http возвращаются с сервера?Сертификат сервера действителен?Можете ли вы опубликовать трассировку стека?

Попробуйте отключить брандмауэр и другие сетевые инструменты, такие как fiddler и т. Д. На вашем клиенте.Также попробуйте со свойством KeepAlive установить значение false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...