【问题标题】:Stream exception & System.Xml.XmlException: '--' is an unexpected token. The expected token is ''流异常 & System.Xml.XmlException: '--' 是一个意外的标记。预期的令牌是 ''
【发布时间】:2012-05-23 11:29:07
【问题描述】:

我收到 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 上运行此代码,但它不再工作了。

【问题讨论】:

    标签: c# xml streamwriter


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      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 块中。您省略了WebResponse 和结果Stream

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-10
        • 2018-10-24
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 2018-11-27
        • 2014-06-04
        • 2018-09-20
        相关资源
        最近更新 更多