문제

Apache 웹 서버에 대한 Http POST를 만들려고 합니다.

요청이 작동하려면 ContentLength 설정이 필요한 것 같습니다.

GetRequestStream()에서 직접 XmlWriter를 만들고 SendChunked를 true로 설정하고 싶지만 그렇게 하면 요청이 무기한 중단됩니다.

내 요청이 생성되는 방법은 다음과 같습니다.

    private HttpWebRequest MakeRequest(string url, string method)
    {
        HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
        request.Method = method;
        request.Timeout = Timeout; //Property in my class, assume it's 10000
        request.ContentType = "text/xml"; //I am only writing xml with XmlWriter
        if (method != WebRequestMethods.Http.Get)
        {
            request.SendChunked = true;
        }
        return request;
    }

ContentLength를 설정할 필요가 없도록 SendChunked를 작동시키려면 어떻게 해야 합니까?XmlWriter의 문자열을 서버로 보내기 전에 어딘가에 저장할 이유가 없습니다.

편집하다:문제를 일으키는 코드는 다음과 같습니다.

    using (Stream stream = webRequest.GetRequestStream())
    {
        using (XmlWriter writer = XmlWriter.Create(stream, XmlTags.Settings))
        {
            Generator.WriteXml<TRequest>(request, writer);
        }
    }

GetRequestStream()에서 반환된 Stream 개체를 사용하지 않기 전에는 XmlWriter가 삭제 시 스트림을 닫았다고 가정했지만 이는 사실이 아닙니다.

아래 답변 중 하나를 알려드리겠습니다.답변으로 표시하겠습니다.

HttpWebRequest에 관한 한 내 원본 코드는 정상적으로 작동합니다.

도움이 되었습니까?

해결책

이것은 당신이 쓰는 방식으로 작동해야합니다. 실제로 업로드하는 코드를 볼 수 있습니까? 스트림을 닫는 것을 기억하십니까?

다른 팁

의 예를 보면 http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.sendchunked.aspx 그들은 여전히 ​​콘텐츠 길이를 설정합니다.실제로 중요한 점은 데이터를 보내는 경우 수신자에게 보낼 데이터의 양을 알려야 한다는 것입니다.요청을 보내기 전에 전송하는 데이터의 양을 왜 알 수 없나요?

내용길이:

자산 가치유형:시스템 .. ::. int64 인터넷 자원으로 보낼 데이터의 바이트 수.기본값은 -1이며, 이는 속성이 설정되지 않았으며 보낼 요청 데이터가 없음을 나타냅니다.

Aaron에 대한 편집(제가 틀렸습니다):

HttpWebRequest httpWebRequest = HttpWebRequest.Create("http://test") as HttpWebRequest;
httpWebRequest.SendChunked = true;
MessageBox.Show("|" + httpWebRequest.TransferEncoding + "|");

System.Net.HttpWebRequest.SerializeHeaders()에서:

if (this.HttpWriteMode == HttpWriteMode.Chunked)
{
    this._HttpRequestHeaders.AddInternal("Transfer-Encoding", "chunked");
}
else if (this.ContentLength >= 0L)
{
    this._HttpRequestHeaders.ChangeInternal("Content-Length", this._ContentLength.ToString(NumberFormatInfo.InvariantInfo));
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top