7

我正在尝试使用 http post 将一些数据从 asp.net 发布到 web 服务。

这样做时,我收到了附带的错误。我检查了很多帖子,但没有什么能真正帮助我。对此的任何帮助将不胜感激。

Length = 'dataStream.Length' 引发了“System.NotSupportedException”类型的异常

Position = 'dataStream.Position' 引发了“System.NotSupportedException”类型的异常

请附上我的代码:

public XmlDocument SendRequest(string command, string request)
{
    XmlDocument result = null;

    if (IsInitialized())
    {
        result = new XmlDocument();

        HttpWebRequest webRequest = null;
        HttpWebResponse webResponse = null;

        try
        {
            string prefix = (m_SecureMode) ? "https://" : "http://";
            string url = string.Concat(prefix, m_Url, command);

            webRequest = (HttpWebRequest)WebRequest.Create(url);
            webRequest.Method = "POST";
            webRequest.ContentType = "text/xml";
            webRequest.ServicePoint.Expect100Continue = false;

            string UsernameAndPassword = string.Concat(m_Username, ":", m_Password);
            string EncryptedDetails = Convert.ToBase64String(Encoding.ASCII.GetBytes(UsernameAndPassword));

            webRequest.Headers.Add("Authorization", "Basic " + EncryptedDetails);

            using (StreamWriter sw = new StreamWriter(webRequest.GetRequestStream()))
            {
                sw.WriteLine(request);
            }

            // Assign the response object of 'WebRequest' to a 'WebResponse' variable.
            webResponse = (HttpWebResponse)webRequest.GetResponse();

            using (StreamReader sr = new StreamReader(webResponse.GetResponseStream()))
            {
                result.Load(sr.BaseStream);
                sr.Close();
            }
        }

        catch (Exception ex)
        {
            string ErrorXml = string.Format("<error>{0}</error>", ex.ToString());
            result.LoadXml(ErrorXml);
        }
        finally
        {
            if (webRequest != null)
                webRequest.GetRequestStream().Close();

            if (webResponse != null)
                webResponse.GetResponseStream().Close();
        }
    }

    return result;
}

提前致谢 !!

拉蒂卡

4

1 回答 1

9

当您调用 时HttpWebResponse.GetResponseStream,它会返回一个没有任何召回能力的Stream实现;换句话说,从 HTTP 服务器发送的字节被直接发送到该流以供使用。

这与一个FileStream实例不同,如果你想读取你已经通过流使用的文件的一部分,磁盘头总是可以移回读取文件的位置(很可能,它被缓冲在内存中,但你明白了)。

对于 HTTP 响应,您实际上必须重新向服务器发出请求才能再次获得响应。因为不能保证该响应是相同的,所以传递回给您的实现上的大多数与位置相关的方法和属性(例如, )Length都会抛出.PositionSeekStreamNotSupportedException

如果您需要在 中向后移动Stream,那么您应该创建一个MemoryStream实例并通过方法将响应复制Stream到 中,如下所示:MemoryStreamCopyTo

using (var ms = new MemoryStream())
{
    // Copy the response stream to the memory stream.
    webRequest.GetRequestStream().CopyTo(ms);

    // Use the memory stream.
}

请注意,如果您没有使用 .NET 4.0 或更高版本(在此引入CopyToStream该类),那么您可以手动复制流

于 2012-05-15T18:41:53.063 回答