2013-02-05 22 views
70
kullanarak bildirme

Bazı form verilerini kendi web uygulamamda olmayan belirli bir URL'ye göndermek istiyorum. "Domain.client.nl" gibi aynı etki alanına sahiptir. Web uygulamasının bir URL "web.domain.client.nl" olduğu ve "idp.domain.client.nl" dir. Ama kodum hiç bir şey yapmıyor ..... Birisi yanlış yaptığımı biliyor mu?Form verilerini HttpWebRequest

Wouter

StringBuilder postData = new StringBuilder(); 
postData.Append(HttpUtility.UrlEncode(String.Format("username={0}&", uname))); 
postData.Append(HttpUtility.UrlEncode(String.Format("password={0}&", pword))); 
postData.Append(HttpUtility.UrlEncode(String.Format("url_success={0}&", urlSuccess))); 
postData.Append(HttpUtility.UrlEncode(String.Format("url_failed={0}", urlFailed))); 

ASCIIEncoding ascii = new ASCIIEncoding(); 
byte[] postBytes = ascii.GetBytes(postData.ToString()); 

// set up request object 
HttpWebRequest request; 
try 
{ 
    request = (HttpWebRequest)HttpWebRequest.Create(WebSiteConstants.UrlIdp); 
} 
catch (UriFormatException) 
{ 
    request = null; 
} 
if (request == null) 
    throw new ApplicationException("Invalid URL: " + WebSiteConstants.UrlIdp); 

request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = postBytes.Length; 
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; 

// add post data to request 
Stream postStream = request.GetRequestStream(); 
postStream.Write(postBytes, 0, postBytes.Length); 
postStream.Flush(); 
postStream.Close(); 
+0

Olası yinelenen: http://stackoverflow.com/questions/5401501/how-to-post-data-to-specific-url-using-webclient-in-c-sharp – Dariusz

+4

değil Diğer özellikle 'WebClient' kullanmak istediği için oldukça yinelenen. –

cevap

34

Bu form yanlış kodlama edilir. Yalnızca değerleri kodlamak gerekir:

StringBuilder postData = new StringBuilder(); 
postData.Append("username=" + HttpUtility.UrlEncode(uname) + "&"); 
postData.Append("password=" + HttpUtility.UrlEncode(pword) + "&"); 
postData.Append("url_success=" + HttpUtility.UrlEncode(urlSuccess) + "&"); 
postData.Append("url_failed=" + HttpUtility.UrlEncode(urlFailed)); 

düzenlemek

ben yanlış. RFC1866 section 8.2.1'a göre, hem adlar hem de değerler kodlanmalıdır.

Ama

bu dava benim kod örneği doğrudur kadar verilen örneğin isim, kodlanması gerekir karakteri yok, zira kodlamak gibi, söz konusu

kod hala yanlıştır) web sunucusunun bunu neden çözemediğinin nedeni olan eşittir işareti.

daha uygun yolu olurdu:

StringBuilder postData = new StringBuilder(); 
postData.AppendUrlEncoded("username", uname); 
postData.AppendUrlEncoded("password", pword); 
postData.AppendUrlEncoded("url_success", urlSuccess); 
postData.AppendUrlEncoded("url_failed", urlFailed); 

//in an extension class 
public static void AppendUrlEncoded(this StringBuilder sb, string name, string value) 
{ 
    if (sb.Length != 0) 
     sb.Append("&"); 
    sb.Append(HttpUtility.UrlEncode(name)); 
    sb.Append("="); 
    sb.Append(HttpUtility.UrlEncode(value)); 
} 
+0

Teşekkürler, ancak şu hatayı alıyorum: Uzak sunucu bir hata verdi: (412) Önkoşul Başarısız. – wsplinter

+0

bunu google yaptınız mı? – jgauffin

+0

Ben google çok :) Ama ben düzeltdim, ben kirli bir şekilde yapıyorum. Ben bir HttpWebRequest yok ama bir dize içinde bir html formu oluşturmak ve tarayıcıya wirte (yükte ben bir gönderme yapacağım). – wsplinter

61

alan adı Hem ve değer url kodlanmış olmalıdır. sonrası veri ve sorgu dizesi biçimidir aynı

yapmanın .net yolu bu

NameValueCollection outgoingQueryString = HttpUtility.ParseQueryString(String.Empty); 
outgoingQueryString.Add("field1","value1"); 
outgoingQueryString.Add("field2", "value2"); 
string postdata = outgoingQueryString.ToString(); 

Bu gibi bir şey alanlar ve değer adları

+8

'string postdata = outgoingQueryString.ToString();' 'System.Collections.Specialized.NameValueCollection '' değerine sahip bir dize verecektir. – sfuqua

+1

Aslında @sfuqua, HttpUtility (özellikle System.Web'deki bir kaynak) için kaynak koyarsanız özel bir NameValueCollection türü döndürdüğünü görürsünüz: return (NameValueCollection) new HttpValueCollection (sorgu, yanlış, doğru, kodlama); Bu, koleksiyonu bir sorgu dizesine doğru şekilde dönüştürür. Ancak RestSharp'dan birini kullanırsanız, ... –

+0

“ToString()” ile bu tam problemi görmüş olduğum gibi, İlginç, şimdi RestSharp kullanırken olup olmadığını hatırlayamıyorum. Kesin bir olasılık. Düzeltme için teşekkürler. – sfuqua

35

deneyin kodlayan ilgilenecek olan Bu:

var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx"); 

var postData = "thing1=hello"; 
    postData += "&thing2=world"; 
var data = Encoding.ASCII.GetBytes(postData); 

request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = data.Length; 

using (var stream = request.GetRequestStream()) 
{ 
    stream.Write(data, 0, data.Length); 
} 

var response = (HttpWebResponse)request.GetResponse(); 

var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
+2

çekicilik gibi çalıştı, teşekkürler :) –

+2

Ben yazmayı tercih ederim: request.Method = WebRequestMethods.Http.Post; – Totalys

+0

check request.HaveResponse yanıt kullanmadan önce –

İlgili konular