POST到HTTPS身份验证错误

时间:2010-12-07 18:07:13

标签: c# web-services

这是一个使用C#控制台应用程序的https网站的简单帖子,我也使用了与webservice相同的东西。当我跑这个它冻结了。下载了小提琴手,我看到了Auth标签 没有Proxy-Authenticate标头。 没有WWW-Authenticate Header。

之前我使用过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 = "test999@test1.com";
            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());
                }
            }


        }
    }
}

4 个答案:

答案 0 :(得分:1)

您正在使用byteData中的数据并通过MemoryStream将其写入自身?您需要使用HttpWebRequest.GetRequestStream来获取信息流,撰写您的信息并确保其已关闭。

答案 1 :(得分: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", "test999@test1.com" },
        { "FirstName", "first" },
        { "LastName", "last" },
    };

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

这也将对您的请求参数进行正确的url编码,这样您就不必手动执行此操作。

当我运行这个时,我得到401 Unauthorized但我想这是因为用于基本身份验证的用户名和密码是假的。

答案 2 :(得分: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 = "test999@test1.com";
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());
    }
}

答案 3 :(得分:0)

可能尝试在请求标头中设置凭据。我参与了一个项目,我必须使用Spring安全性从Web应用程序请求一些数据,我可以通过请求标头中的set credential来实现它的唯一工作方式。

代码看起来像这样:

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/