我正在尝试使用http post将一些数据从asp.net发布到webservice。
在执行此操作时,我收到了所附错误。我检查过很多帖子,但没有什么可以帮助我。对此有任何帮助将非常感激。
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;
}
提前致谢!!
Ratika
答案 0 :(得分:7)
当你致电HttpWebResponse.GetResponseStream
时,它会返回一个Stream
implementation,它没有任何召回能力;换句话说,从HTTP服务器发送的字节将直接发送到此流以供使用。
这与FileStream
instance不同,如果您想要读取已经通过流消耗的文件的一部分,则可以始终将磁头移回到要读取的位置来自的文件(很可能,它在内存中缓存,但你明白了。)
使用HTTP响应,您必须实际重新发出对服务器的请求才能再次获得响应。由于该响应不能保证相同,因此Stream
实现中的大多数与位置相关的方法和属性(例如Length
,Position
,Seek
)都会传回你抛出一个NotSupportedException
。
如果您需要在Stream
中向后移动,则应创建MemoryStream
instance并将回复Stream
复制到MemoryStream
至CopyTo
method ,像这样:
using (var ms = new MemoryStream())
{
// Copy the response stream to the memory stream.
webRequest.GetRequestStream().CopyTo(ms);
// Use the memory stream.
}
请注意,如果您不使用.NET 4.0或更高版本(CopyTo
类引入了Stream
),那么您可以copy the stream manually。