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ブロック内にある必要があります。WebResponseと resultを省略しましたStream

また、を直接XmlDocument.Load受け入れることができるStreamので、中間で使用する必要はありませんでしたStreamReader。さらに、try/catch ブロックを完全に削除し、呼び出し元が XML を読み取ってエラーが発生したかどうかを判断する必要がないようにすることをお勧めします。ただし、どうしてもそうする場合は、少なくとも XML API を使用して XML を構築する必要があります。の中に何が入っているのかわからないex.ToString()ので、それを の中に投げ込むと、<error>{0}</error>無効な XML が生成される可能性が非常に高くなります。

于 2012-05-16T19:14:04.170 に答える