문제

저의 목표는 실패 할 때 비동기식 httpwebrequest를 재 시도하는 것입니다.

내가 중단 () httpwebrequest, 나는 다시 비난 할 수 없습니다. 따라서 다시 요청하는 유일한 방법은 아마도 httpwebrequest 객체를 재현하는 것입니다. 이전 객체에서 모든 속성을 복사해야하기 때문에 많은 작업이 필요합니다. 바로 가기가 있습니까?

참고 : 직렬화는 내 문제를 해결할 것이라고 생각하지만이 수업은 이전 질문.

업데이트 기존 소스 코드가 필요하지 않기 때문에 제거되었습니다

이 문제에 대한 현재 견해 바로 가기가 없으며, 요청을 다시 실행하는 유일한 방법은 원래의 것과 같은 방식으로 다른 HTTPWebRequest 객체를 만드는 것입니다.

도움이 되었습니까?

해결책

있을 수있다!

새로운 것을 만들면됩니다 HttpWebRequest 그리고 반사를 통해 모든 속성을 이전 물체에서 그 위에 복사하십시오.

여기에 있습니다 확장 방법 그렇게합니다 :

/// <summary>
/// Clones a HttpWebRequest for retrying a failed HTTP request.
/// </summary>
/// <param name="original"></param>
/// <returns></returns>
public static HttpWebRequest Clone(this HttpWebRequest original)
{
    // Create a new web request object
    HttpWebRequest clone = (HttpWebRequest)WebRequest.Create(original.RequestUri.AbsoluteUri);

    // Get original fields
    PropertyInfo[] properties = original.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

    // There are some properties that we can't set manually for the new object, for various reasons
    List<string> excludedProperties = new List<String>(){ "ContentLength", "Headers" };

    // Traverse properties in HttpWebRequest class
    foreach (PropertyInfo property in properties)
    {
        // Make sure it's not an excluded property
        if (!excludedProperties.Contains(property.Name))
        {
            // Get original field value
            object value = property.GetValue(original);

            // Copy the value to the new cloned object
            if (property.CanWrite)
            {
                property.SetValue(clone, value);
            }
        }
    }

    return clone;
}

동일한 요청을 다시 발행하려면 다음을 실행하기 만하면됩니다.

// Create a request
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.google.com/");

// Change some properties...

// Execute it
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

// Clone the request to reissue it using our extension method
request = request.Clone();

// Execute it again
response = (HttpWebResponse)request.GetResponse();

다른 팁

불가능합니다.

httpwebrequest 인스턴스는 문자 그대로 하나의 요청 인스턴스를 나타냅니다 (내부적으로 재 시도하는 가장자리 케이스가 있지만) 따라서 논리적으로 반복 할 수있는 것은 아닙니다. 정확히 하나의 응답 (요청/응답이 논리적 쌍 임)을 반환 할 수 있으며, 응답을 여러 번 검사 할 수는 있지만 정확히 동일한 객체를 얻을 수 있습니다.

기본적으로 HTTPWebrequest 인스턴스는 일종의 공장이라고 생각하지만 실제로는 구체적입니다. 다른 인스턴스를 만들어야합니다.

요청을 어디에서 일련화하려고합니까? 요청을 직렬화하는 것이 좋습니다. ~ 전에 당신은 그것을 만들려고 시도한 다음, 실패에 대한 요청을 재현하려고합니다 (직렬화 된 인스턴스에서).

또한 프록시를 제거하고 인스턴스를 직렬화 한 다음 프록시를 다시 설정할 수 있습니다. 문제가 요청을 직렬화하는 데있어 문제가있는 것 같습니다.

바로 가기가 없으며, 요청을 다시 실행하는 유일한 방법은 원래의 것과 같은 방식으로 다른 HTTPWebRequest 객체를 만드는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top