使用C#远程HTTP发布

你如何在C#中进行远程HTTP发布(请求)?

这是我写过的一个小应用程序的代码,用于将带有值的表单发布到URL。 它应该非常强大。

_formValues是一个Dictionary ,包含要发布的变量及其值。

// encode form data StringBuilder postString = new StringBuilder(); bool first=true; foreach (KeyValuePair pair in _formValues) { if(first) first=false; else postString.Append("&"); postString.AppendFormat("{0}={1}", pair.Key, System.Web.HttpUtility.UrlEncode(pair.Value)); } ASCIIEncoding ascii = new ASCIIEncoding(); byte[] postBytes = ascii.GetBytes(postString.ToString()); // set up request object HttpWebRequest request; try { request = WebRequest.Create(url) as HttpWebRequest; } catch (UriFormatException) { request = null; } if (request == null) throw new ApplicationException("Invalid URL: " + url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postBytes.Length; // add post data to request Stream postStream = request.GetRequestStream(); postStream.Write(postBytes, 0, postBytes.Length); postStream.Close(); HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

您可以使用WCF或创建WebRequest

 var httpRequest = (HttpWebRequest)WebRequest.Create("http://localhost/service.svc"); var httpRequest.Method = "POST"; using (var outputStream = httpRequest.GetRequestStream()) { // some complicated logic to create the message } var response = httpRequest.GetResponse(); using (var stream = response.GetResponseStream()) { // some complicated logic to handle the response message. } 

我用这个非常简单的类:

  public class RemotePost{ private System.Collections.Specialized.NameValueCollection Inputs = new System.Collections.Specialized.NameValueCollection() ; public string Url = "" ; public string Method = "post" ; public string FormName = "form1" ; public void Add( string name, string value ){ Inputs.Add(name, value ) ; } public void Post(){ System.Web.HttpContext.Current.Response.Clear() ; System.Web.HttpContext.Current.Response.Write( "" ) ; System.Web.HttpContext.Current.Response.Write( string .Format( "" ,FormName)) ; System.Web.HttpContext.Current.Response.Write( string .Format( "
" , FormName,Method,Url)) ; for ( int i = 0 ; i< Inputs.Keys.Count ; i++){ System.Web.HttpContext.Current.Response.Write( string .Format( "" ,Inputs.Keys[i],Inputs[Inputs.Keys[i]])) ; } System.Web.HttpContext.Current.Response.Write( "
" ) ; System.Web.HttpContext.Current.Response.Write( "" ) ; System.Web.HttpContext.Current.Response.End() ; } }

你就这样使用它:

 RemotePost myremotepost = new RemotePost() ; myremotepost.Url = "http://www.jigar.net/demo/HttpRequestDemoServer.aspx" ; myremotepost.Add( "field1" , "Huckleberry" ) ; myremotepost.Add( "field2" , "Finn" ) ; myremotepost.Post() ; 

非常干净,易于使用,并封装了所有的渣土。 我更喜欢这个直接使用HttpWebRequest等。

还有System.Net.WebClient

使用WebRequest.Create()并设置Method属性。

我使用以下代码来使用httpwebrequest类调用webservices:

 internal static string CallWebServiceDetail(string url, string soapbody, int timeout) { return CallWebServiceDetail(url, soapbody, null, null, null, null, null, timeout); } internal static string CallWebServiceDetail(string url, string soapbody, string proxy, string contenttype, string method, string action, string accept, int timeoutMilisecs) { var req = (HttpWebRequest) WebRequest.Create(url); if (action != null) { req.Headers.Add("SOAPAction", action); } req.ContentType = contenttype ?? "text/xml;charset=\"utf-8\""; req.Accept = accept ?? "text/xml"; req.Method = method ?? "POST"; req.Timeout = timeoutMilisecs; if (proxy != null) { req.Proxy = new WebProxy(proxy, true); } using(var stm = req.GetRequestStream()) { XmlDocument doc = new XmlDocument(); doc.LoadXml(soapbody); doc.Save(stm); } using(var resp = req.GetResponse()) { using(var responseStream = resp.GetResponseStream()) { using(var reader = new StreamReader(responseStream)) { return reader.ReadToEnd(); } } } } 

这可以很容易地用于调用Web服务

 public void TestWebCall() { const string url = "http://www.ecubicle.net/whois_service.asmx/HelloWorld"; const string soap = @"  "; string responseDoc = CallWebServiceDetail(url, soap, 1000); XmlDocument doc = new XmlDocument(); doc.LoadXml(responseDoc); string response = doc.DocumentElement.InnerText; } 
 HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://www.google.com"); HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse(); Console.WriteLine(HttpWResp.StatusCode); HttpWResp.Close(); 

如果请求成功,应打印“OK”(200)

从C#,Java或PHP等高级语言开始的问题是,人们可能从未知道地下实际上有多么简单。 所以这里有一个简短的介绍:

http://reboltutorial.com/blog/raw-http-request/