0

我收到 StreamWriter 抛出的错误,我收到的消息是:

Length = '(sw.BaseStream).Length' threw an exception of type 'System.NotSupportedException'
Position = '(sw.BaseStream).Position' threw an exception of type 'System.NotSupportedException'

堆栈跟踪:

Message: System.Xml.XmlException: '6163592' is an unexpected token. The expected token is '\'" or "".
Stack Trace: System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
   at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(String expectedToken1, String expectedToken2)
   at System.Xml.XmlTextReaderImpl.ParseAttributes()
   at System.Xml.XmlTextReaderImpl.ParseElement()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
   at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
   at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
   at System.Xml.XmlDocument.Load(XmlReader reader)
   at System.Xml.XmlDocument.Load(Stream inStream)
   at BasecampManager.SendRequest(String command, String request) in C:\Inetpub\wwwroot\basecamp\Basecamp_Net_20_API_src\BasecampAPI\BasecampManager.cs:line 146

我的代码:

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);

            //MessageBox.Show(webRequest.GetRequestStream().ToString());

            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;
}

我不确定是什么问题。我检查了很多帖子,但没有什么能真正帮助我。

几个月前,这段代码运行良好。现在它通过异常自动停止工作。通过认为这可能是 VS 2005 的一些问题,我尝试在 VS 2005、2008、2010 上运行此代码,但它不再起作用。

4

2 回答 2

6

很可能服务器响应不再是有效的 XML。

使用一些 HTTP 调试工具(即Fiddler)来查看响应的实际样子。或者将响应保存为文本,而不是尝试加载为 XML。

于 2012-05-15T22:27:08.610 回答
0

对您的代码的一些建议改进:

public XmlDocument SendRequest(string command, string request)
{
    if (!IsInitialized())
        return null;

    var result = new XmlDocument();

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

        webRequest.Method = "POST";
        webRequest.ContentType = "text/xml";
        webRequest.ServicePoint.Expect100Continue = false;

        var UsernameAndPassword = string.Concat(m_Username, ":", m_Password);
        var EncryptedDetails = Convert.ToBase64String(Encoding.ASCII.GetBytes(UsernameAndPassword));
        webRequest.Headers.Add("Authorization", "Basic " + EncryptedDetails);

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

        using (var webResponse = webRequest.GetResponse())
        {
            using (var responseStream = webResponse.GetResponseStream())
            {
                result.Load(responseStream);
            }
        }
    }
    catch (Exception ex)
    {
        result.LoadXml("<error></error>");
        result.DocumentElement.InnerText = ex.ToString();
    }
    return result;
}

您创建的所有实现 IDisposable 的对象都应该在一个using块中。您省略了WebResponseand 结果Stream

另外,XmlDocument.Load可以直接接受 a Stream,所以不需要在中间使用StreamReader。我会进一步建议完全删除 try/catch 块,而不是强制调用者必须读取 XML 以确定是否发生错误。但是,如果您坚持这样做,那么您至少应该使用 XML API 来构建您的 XML。您不知道 . 的内部是什么ex.ToString(),因此很可能将其放入其中<error>{0}</error>会产生无效的 XML。

于 2012-05-16T19:14:04.170 回答