2010-12-07 7 views
3

Это простая запись на сайт https с помощью консольного приложения C#, я использовал то же самое и с webservice. Когда я запустил это, он застыл. Скачан скрипач и на вкладке Auth я вижу Нет заголовка прокси-аутентификации. Нет заголовка WWW-Authenticate.Ошибка аутентификации POST-HTTPS

Раньше я использовал Stream вместо MemoryStream. Я прокомментировал некоторые из вещей, которые я использовал раньше, но не работал, как preauthenticate.

Я могу войти на сайт, чтобы получить подписчика через IE, используя того же пользователя и пароль. Может кто-нибудь, пожалуйста, скажите мне, что случилось ?.

using System; 
using System.IO; 
using System.Net; 
using System.Text; 
using System.Web; 

namespace Examples.System.Net 
{ 
    public class WebRequestPostExample 
    { 
     public static void Main() 
     { 
      Uri requestUri = new Uri("https://services.yesmail.com/enterprise/subscribers");    

      // Set the Method property of the request to POST. 
      CredentialCache cache = new CredentialCache(); 
      NetworkCredential nc = new NetworkCredential("user/user1", "password");     
      cache.Add(requestUri, "Basic", nc); 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 

      //request.PreAuthenticate = true; 
      //request.KeepAlive = false; 

      request.Method = WebRequestMethods.Http.Post; 
      request.ContentType = "application/xml;charset=ISO-8859-1"; 

      //request.ContentType = "application/xml-www-form-urlencoded";  
      //request.Timeout = 300000; 


      string EmailAddress = "[email protected]"; 
      string FirstName = "first"; 
      string LastName = "Last"; 

      StringBuilder Efulfill = new StringBuilder(); 


      Efulfill.Append("EmailAddress" + HttpUtility.UrlEncode(EmailAddress)); 
      Efulfill.Append("FirstName" + HttpUtility.UrlEncode(FirstName)); 
      Efulfill.Append("LastName" + HttpUtility.UrlEncode(LastName)); 


      byte[] byteData = Encoding.UTF8.GetBytes(Efulfill.ToString()); 

      request.ContentType = "application/xml;charset=ISO-8859-1"; 

      request.ContentLength = byteData.Length; 



      using (MemoryStream Stream = new MemoryStream(byteData)) 
      { 
       // Write the stream. 
       Stream.Write(byteData, 0, byteData.Length); 
       Stream.Close(); 
      } 
      //Get response 

      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
      { 
       using (Stream resStream = response.GetResponseStream()) 
       { 
        StreamReader reader = new StreamReader(resStream, Encoding.Default); 
        Console.WriteLine(reader.ReadToEnd()); 
       } 
      } 


     } 
    } 
} 
+0

С правильными учетными данными еще я получаю Удаленный сервер возвратил ошибку: (401) Несанкционированная, любая идея? – Rasi 2010-12-08 19:01:01

+0

Вы когда-нибудь это понимали? – 2012-06-26 22:48:38

ответ

1

Вы берете данные в byteData и записываете их через себя через MemoryStream? Вы должны использовать HttpWebRequest.GetRequestStream, чтобы получить поток, написать данные своего сообщения и убедиться, что он закрыт.

0

Я скопировал ваш код, и он не будет работать, потому что вы ничего не делали с опубликованным потоком данных, прежде чем получать ответ. Я скопировал код, и он работает так, как ожидалось. Просто подставьте свои верительные грамоты, и это хорошо.

Uri requestUri = new Uri("https://services.yesmail.com/enterprise/subscribers");    

// Set the Method property of the request to POST. 
var cache = new System.Net.CredentialCache(); 
var nc = new System.Net.NetworkCredential("user/user1", "password");     
cache.Add(requestUri, "Basic", nc); 
var request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(requestUri); 

//request.PreAuthenticate = true; 
//request.KeepAlive = false; 

request.Method = System.Net.WebRequestMethods.Http.Post; 
request.ContentType = "application/xml;charset=ISO-8859-1"; 

request.ContentType = "application/xml-www-form-urlencoded";  
//request.Timeout = 300000; 

string EmailAddress = "[email protected]"; 
string FirstName = "first"; 
string LastName = "Last"; 

StringBuilder Efulfill = new StringBuilder(); 

Efulfill.Append("EmailAddress" + System.Web.HttpUtility.UrlEncode(EmailAddress)); 
Efulfill.Append("FirstName" + System.Web.HttpUtility.UrlEncode(FirstName)); 
Efulfill.Append("LastName" + System.Web.HttpUtility.UrlEncode(LastName)); 

byte[] byteData = Encoding.UTF8.GetBytes(Efulfill.ToString()); 

request.ContentType = "application/xml;charset=ISO-8859-1"; 
request.ContentLength = byteData.Length; 

Stream postStream = request.GetRequestStream(); 
postStream.Write(byteData, 0, byteData.Length); 
postStream.Close(); 

//Get response 

using (var response = (System.Net.HttpWebResponse)request.GetResponse()) 
{ 
    using (Stream resStream = response.GetResponseStream()) 
    { 
     StreamReader reader = new StreamReader(resStream, Encoding.Default); 
     Console.WriteLine(reader.ReadToEnd()); 
    } 
} 
+0

Тем не менее я получаю Удаленный сервер возвратил ошибку: (401) Неавторизованный. – Rasi 2010-12-08 17:05:07

1

Есть ли какая-либо конкретная причины вы хотели бы написать оооочень много кода, когда вы могли бы просто:

using (var client = new WebClient()) 
{ 
    var requestUri = new Uri("https://services.yesmail.com/enterprise/subscribers"); 
    var cache = new CredentialCache(); 
    var nc = new NetworkCredential("user/user1", "password"); 
    cache.Add(requestUri, "Basic", nc); 
    client.Credentials = cache; 

    var values = new NameValueCollection 
    { 
     { "EmailAddress", "[email protected]" }, 
     { "FirstName", "first" }, 
     { "LastName", "last" }, 
    }; 

    var result = client.UploadValues(requestUri, values); 
    Console.WriteLine(Encoding.Default.GetString(result)); 
} 

Это будет также заботиться о правильно URL кодирующего ваших параметров запроса, так что вы не придется делать это вручную.

Когда я запустил это, я получил 401 Unauthorized, но я думаю, это потому, что имя пользователя и пароль, используемые для базовой проверки подлинности, являются пустыми.

0

Возможно, попробуйте установить учетные данные в заголовке запроса. Я работал над проектом, где мне нужно запросить некоторые данные из веб-приложения, используя весеннюю безопасность, и единственный способ заставить его работать - установить учетные данные в заголовке запроса.

код выглядит примерно так:

string authInfo = username + ":" + password; 
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
request.Headers["Authorization"] = "Basic " + authInfo; 

для более подробной информации см этом блоге

http://charlie.cu.cc/2012/05/how-use-basic-http-authentication-c-web-request/

Смежные вопросы