Https POST Php den C #

2 Cevap

Ben veri procesed ve geri gönderilen almak için bir üçüncü taraf https url bir yazı yapmak zorunda. Ve ben bir örnek olarak tüm şudur:

$signature= foo_string;
$data_to_post = json_dictionary;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $base_url);
curl_setopt($ch, CURLOPT_USERPWD, "$user:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_HTTPHEADER,array("JSON-Signature: $signature"));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_to_post);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);

Biz ASP. NET C # 2.0 ile çalışırken, ben noktasına bu var, ama ben her zaman bir autenticated değil hatası alıyorum.

İşte ben ne yapıyorum:

HttpWebRequest q = (HttpWebRequest)WebRequest.Create(Host + ":" + Port);
                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(new interhanse().AcceptAllCertifications);                

                q.Method = "POST";
                q.Headers.Add("JSON-Signature:" + GetSignature(data));
                q.ContentType = "application/json";

                q.UseDefaultCredentials = false;
                q.Credentials = new NetworkCredential(user,pwd, Host);

                byte[] buffer = UTF8Encoding.UTF8.GetBytes(data);

                q.ContentLength = data.Length;                

                Stream oStream = q.GetRequestStream();
                StreamWriter oWriter = new StreamWriter(oStream);
                oWriter.Write(buffer);
                oWriter.Close();


                HttpWebResponse reps = q.GetResponse() as HttpWebResponse;

Ben bu konuda bulabilirsiniz tüm SO soruları okudum, ama ben herhangi bir yenilik alamadım. Şimdiden teşekkürler!

2 Cevap

Evet, yanlış yaptığınızı bir şey de uzunluk bytes characters de uzunluğu aynı olduğu varsayılır. Sen içerik uzunluğu için buffer.Length kullanmalısınız. Ayrıca StreamWriter.Write bir byte array ile çağırıyorlar. Bunu yapmamalısın - Zaten kodlama yaptık gibi sadece, akışı kullanmalısınız:

byte[] buffer = Encoding.UTF8.GetBytes(data);

q.ContentLength = buffer.Length;
using (Stream stream = q.GetRequestStream())
{
    stream.Write(buffer, 0, buffer.Length);
}

Şimdi, bu kimlik doğrulama sorunu çözmez. Sadece ayar PreAuthenticate bu olsa çözer bulabilirsiniz:

q.PreAuthenticate = true;

Bu işe yaramazsa, ben seni WireShark çalıştırmak önermek ve Curl yoluyla istek ve. NET talebi arasındaki farklılıklar bakmak.

Ben kimlik doğrulaması ana kaynağı değil gerektiğini düşünüyorum ...

q.Credentials = new NetworkCredential(user,pwd);

Gibi bir şey olurdu:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Host + ":" + Port);
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(new interhanse().AcceptAllCertifications);

request.Method = "POST";
request.Headers.Add("JSON-Signature:" + GetSignature(data));
request.ContentType = "application/json";

request.UseDefaultCredentials = false;
request.Credentials = new NetworkCredential(user, pwd);

byte[] buffer = UTF8Encoding.UTF8.GetBytes(data);

request.ContentLength = buffer.Length;
using (Stream oStream = request.GetRequestStream()) {
	oStream.Write(buffer, 0, buffer.Length);
}
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
	// load data from response here
}

Ayrıca her isteği üzerine hizmet noktası doğrulama temsilci atayarak kaçınmalısınız, doğrulama birden çok kez gerçekleştirilen çünkü bu artan istekleri yavaşlatabilir, ve aynı zamanda tür bir bellek sızıntısı var.