繁体   English   中英

C# - HttpWebRequest - POST

[英]C# - HttpWebRequest - POST

我正在尝试向 Apache Web 服务器发送 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;
    }

我怎样才能让 SendChunked 工作,这样我就不必设置 ContentLength? 我看不出有理由在将 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上的示例,他们仍然设置了内容长度。 真正的底线是,如果您正在发送数据,您需要告诉接收方您将发送多少数据。 为什么在发送请求之前不知道要发送多少数据?

内容长度:

属性值类型:System..::.Int64 要发送到 Internet 资源的数据字节数。 默认值为 -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));
}

我更喜欢使用通用方法来遵守这种东西。 看看下面的 XML 发送方请求。 它将序列化您的 XML,然后使用适当的 ContentType 发送它:

public bool SendXMLRequest<T>(T entity, string url, string method)
{
    HttpWebResponse response = null;
    bool received = false;
    try
    {
        var request = (HttpWebRequest)WebRequest.Create(url);
        var credCache = new CredentialCache();
        var netCred = new NetworkCredential(YOUR_LOGIN_HERE, YOUR_PASSWORD_HERE, YOUR_OPTIONAL_DOMAIN_HERE);
        credCache.Add(new Uri(url), "Basic", netCred);
        request.Credentials = credCache;
        request.Method = method;
        request.ContentType = "application/xml";
        request.SendChunked = "GET" != method.ToUpper();

        using (var writer = new StreamWriter(request.GetRequestStream()))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));

            using (StringWriter textWriter = new Utf8StringWriter())
            {
                serializer.Serialize(textWriter, entity);
                var xml = textWriter.ToString();
                writer.Write(xml);
            }
        }

        response = (HttpWebResponse)request.GetResponse();    
        received = response.StatusCode == HttpStatusCode.OK; //YOu can change the status code to check. May be created, etc...
    }
    catch (Exception ex) { }
    finally
    {
        if(response != null)
            response.Close();
        }

    return received;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM