来自c#程序的HTTP请求,无需响应

来自c#程序的HTTP请求,无需响应,c#,C#,我做过一些套接字工作,我必须发送一个请求,因为我想得到一个响应,但我需要用C#编写一些东西,它只需要调用一个旧的网页,它需要大约10秒的时间来响应,而不是等待响应(失败将用DB调用来标记) 有一种简单的方法可以做到这一点吗?试试看您可以在System.Net.WebClient类上使用异步方法: var webClient = new System.Net.WebClient(); webClient.DownloadStringAsync("your_url") 你是说: HttpWebRe

我做过一些套接字工作,我必须发送一个请求,因为我想得到一个响应,但我需要用C#编写一些东西,它只需要调用一个旧的网页,它需要大约10秒的时间来响应,而不是等待响应(失败将用DB调用来标记)


有一种简单的方法可以做到这一点吗?

试试看

您可以在System.Net.WebClient类上使用异步方法:

var webClient = new System.Net.WebClient();
webClient.DownloadStringAsync("your_url")

你是说:

HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url);
HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
resp.Close();
使用类,但启动请求。 这实际上是在另一个线程中运行请求,您也可以自己执行该任务。

尝试此线程:


(这种方法有时被称为“触发并忘记”)

如果你想通过POST添加参数,你也可以使用这种方法(如果你不需要,干脆忽略响应)。它采用字典形式的参数,但可以很容易地进行修改,以便以任何方式工作

private String DownloadData(String URL, Dictionary<String, String> Parameters)
{
    String postString = String.Empty;
    foreach (KeyValuePair<string, string> postValue in Parameters)
    {
        foreach (char c in postValue.Value)
        { postString += String.Format("{0}={1}&", postValue.Key, postValue.Value); }
    }

    postString = postString.TrimEnd('&');

    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(URL);
    webRequest.Method = "POST";
    webRequest.ContentLength = postString.Length;
    webRequest.ContentType = "application/x-www-form-urlencoded";

    StreamWriter streamWriter = null;
    streamWriter = new StreamWriter(webRequest.GetRequestStream());
    streamWriter.Write(postString);
    streamWriter.Close();

    String postResponse;

    HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
    using (StreamReader responseStream = new StreamReader(webResponse.GetResponseStream()))
    {
        postResponse = responseStream.ReadToEnd();
        responseStream.Close();
    }

    return postResponse;
}
私有字符串下载数据(字符串URL、字典参数)
{
String postString=String.Empty;
foreach(参数中的KeyValuePair postValue)
{
foreach(postValue.Value中的字符c)
{postString+=String.Format(“{0}={1}&”,postValue.Key,postValue.Value);}
}
postString=postString.TrimEnd('&');
HttpWebRequest webRequest=(HttpWebRequest)webRequest.Create(URL);
webRequest.Method=“POST”;
webRequest.ContentLength=postString.Length;
webRequest.ContentType=“application/x-www-form-urlencoded”;
StreamWriter StreamWriter=null;
streamWriter=新的streamWriter(webRequest.GetRequestStream());
streamWriter.Write(postString);
streamWriter.Close();
字符串后响应;
HttpWebResponse webResponse=(HttpWebResponse)webRequest.GetResponse();
使用(StreamReader responseStream=newstreamreader(webResponse.GetResponseStream())
{
postResponse=responseStream.ReadToEnd();
responseStream.Close();
}
返回应答;
}

使用异步仍在等待响应,只是在另一个线程中。这并不能回答问题。添加一个单独的线程(该线程将持续数秒或数分钟)是不可伸缩的。没有线程。这是软件中断。这不能回答问题。使用Async仍然会使线程和套接字等待响应。正确的解决方案是终止TCP连接。每个人似乎都使用“使用异步”来回答。对于未来的读者,请不要在任何需要可伸缩性的情况下这样做。您将暂停线程和套接字等待响应。正确的答案是,不,似乎没有一个内置的简单方法来做到这一点。“最低”级别的HTTP类HttpWebRequest不提供对底层套接字/连接的访问。使用
KeepAlive=false
会有所帮助。