c# - 连续流媒体网站上的 .NET HTTP 请求超时不是 "Aborting"

标签 c# httprequest

范围

我为 Http Web Request 开发了一个包装器类以更简单的方式执行 Gets 和 Posts。这个库已经使用了两年多没有任何问题,但是今天,我们遇到了一个奇怪的问题。

one website (加载需要一些时间),显然,这会将字符流式传输到 HTML 前端,因此我们的库“Get”请求陷入循环。

不同的超时属性

查看 Http Web Request 引用,我们发现有两个不同的 timeout 属性。我们正在使用它们,但它们似乎都无法正常中止。

  • Read Write Timeout - 获取或设置在流中写入或读取时的超时时间(以毫秒为单位)。
  • Timeout - 获取或设置 GetResponse 和 GetRequestStream 方法的超时值(以毫秒为单位)。

一个超时来统治他们

有没有什么方法可以设置“操作超时”,在一些预先配置的时间后强制处理流/连接?

一些代码示例

public class Program
{
public static void Main()
{
    string url = "http://anus.io";

    Console.WriteLine("Initializing Request State Object");

    RequestState myRequestState = new RequestState();

    // Creating Http Request
    myRequestState.request  =  (HttpWebRequest)WebRequest.Create(url);
    myRequestState.request.Method           = "GET";
    myRequestState.request.ReadWriteTimeout = 4000;
    myRequestState.request.Timeout          = 4000;

    Console.WriteLine("Begining Async Request");


    IAsyncResult ar = myRequestState.request.BeginGetResponse(new AsyncCallback(ResponseCallback), myRequestState);

    Console.WriteLine("Waiting for Results");
    ar.AsyncWaitHandle.WaitOne();

    myRequestState.response = (HttpWebResponse)myRequestState.request.EndGetResponse(ar);
    Console.WriteLine("Response status code = {0}", myRequestState.response.StatusCode);

}

public static void ResponseCallback (IAsyncResult asyncResult)
{
    Console.WriteLine("Completed");
}
}

This Code seem to work fine ,但是我如何将响应读取为字符串,因为它一直在传输(如浏览器所示)?

问题

处理此类网站的正确方法是什么? (我所说的句柄是指能够识别和跳过服务器根本不会停止传输的情况?)

最佳答案

试试这个:

public static void Main()
{

    string url = "http://anus.io";

    ***int DefaultTimeOut = 15000;*** //timeout after 15 sec

    Console.WriteLine("Initializing Request State Object");

    RequestState myRequestState = new RequestState();

    // Creating Http Request
    myRequestState.request  =  (HttpWebRequest)WebRequest.Create(url);
    myRequestState.request.Method           = "GET";
    myRequestState.request.ReadWriteTimeout = 4000;
    myRequestState.request.Timeout          = 4000;

    Console.WriteLine("Begining Async Request");


    IAsyncResult ar = myRequestState.request.BeginGetResponse(new AsyncCallback(ResponseCallback), myRequestState);

    ***ThreadPool.RegisterWaitForSingleObject(ar.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myRequestState.request, DefaultTimeOut, true);***

    Console.WriteLine("Waiting for Results");
    ar.AsyncWaitHandle.WaitOne();

    try{

    myRequestState.response = (HttpWebResponse)myRequestState.request.EndGetResponse(ar);
    Console.WriteLine("Response status code = {0}", myRequestState.response.StatusCode);
    }catch(Exception){
       Console.WriteLine("Request Aborted");
    }
}

public static void ResponseCallback (IAsyncResult asyncResult)
{
    Console.WriteLine("Completed");
}

//call the timeout if more than 15 seconds

**public static void TimeoutCallback(object state, bool timedOut)
{
            if (timedOut)
            {
                HttpWebRequest request = state as HttpWebRequest;
                if (request != null)
                {
                    request.Abort();
                }
            }
}**

关于c# - 连续流媒体网站上的 .NET HTTP 请求超时不是 "Aborting",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27745781/

相关文章:

ios - 如何在 Swift 中查看来自 HTTP GET 请求的服务器响应?

express - Express-发出解析查询参数,错误的请求

c# - WPF 的 C# 代码中的 XPath

c# - 将 Image 对象作为参数从 C# 传递到 Python

c# - Application Insights 不记录自定义事件

vba - 使用msxml2.xmlhttp.3.0将数据发送到web以选择EXCEL VBA中的Datepicker

c# - 使用验证属性的 Web API 单字符串参数验证

c# - WebApi 2 路由使用 ?或者/

C Socket写HTTP GET请求: error 400

java - 读取 HTTP 请求参数时将垃圾字符添加到字符串