这是一个使用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());
}
}
}
}
}
答案 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/