使用C#进行远程HTTP Post

4
在C#中如何进行远程HTTP Post请求?
8个回答

11

这是我曾经编写的一个小应用程序的代码,用于将带有值的表单发布到URL。 它应该非常健壮。

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


// 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;


谢谢,关于如何构建POST数据的细节真的很有帮助! - Liam
请求.GetResponse必须跟随括号:*request.GetResponse()*,无论如何感谢您提供的可用代码 :) - Timofey

5

我使用这个非常简单的类:

 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( "<html><head>" ) ;

         System.Web.HttpContext.Current.Response.Write( string .Format( "</head><body onload=\"document.{0}.submit()\">" ,FormName)) ;

         System.Web.HttpContext.Current.Response.Write( string .Format( "<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >" ,

        FormName,Method,Url)) ;
            for ( int  i = 0 ; i< Inputs.Keys.Count ; i++){
            System.Web.HttpContext.Current.Response.Write( string .Format( "<input name=\"{0}\" type=\"hidden\" value=\"{1}\">" ,Inputs.Keys[i],Inputs[Inputs.Keys[i]])) ;
         }
        System.Web.HttpContext.Current.Response.Write( "</form>" ) ;
         System.Web.HttpContext.Current.Response.Write( "</body></html>" ) ;
         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等工具。

1
如果我理解正确的话,它实际上并没有发布一个表单,而是响应一个可以被发布的表单。 - David
1
我点了踩,因为它只在网页响应的情况下起作用,即使在这种情况下,它也会破坏您可能想要在该页面中执行的任何其他操作。此外,它只允许进行一次性的发布,并且是一种复杂的方式来实现它。 - Misko

4

你可以使用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.
}

2

2
此外,还有 System.Net.WebClient

1
我正在使用以下代码片段,通过httpwebrequest类调用Web服务:
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 = 
@"<soap:Envelope xmlns:soap='about:envelope'>
    <soap:Body><HelloWorld /></soap:Body>
</soap:Envelope>";
    string responseDoc = CallWebServiceDetail(url, soap, 1000);
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(responseDoc);
    string response = doc.DocumentElement.InnerText;
}

0
HttpWebRequest HttpWReq = 
(HttpWebRequest)WebRequest.Create("http://www.google.com");

HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();
Console.WriteLine(HttpWResp.StatusCode);
HttpWResp.Close();

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

1
由于 OP 正在进行 POST 操作,您应该同时提到请求流方面。 - bendewey

-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接