7

httpポストを使用して、asp.netからWebサービスにデータを投稿しようとしています。

それをしている間、同封のエラーが発生しています。多くの投稿をチェックしましたが、何も役に立ちません。これに関するヘルプは大歓迎です。

長さ = '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が返されます。つまり、HTTP サーバーから送信されたバイトは、このストリームに直接送信されて消費されます。Stream

これは、FileStreamたとえば、ストリームを介して既に消費したファイルのセクションを読みたい場合、ディスク ヘッドをいつでもファイルを読み込む場所に戻すことができるという点で異なります (おそらく、メモリにバッファリングされますが、要点はわかります)。

HTTP 応答では、応答を再度取得するために実際にサーバーに要求を再発行する必要があります。その応答が同じであることが保証されていないため、実装で返された位置関連のメソッドとプロパティ (例: 、)Lengthのほとんどは.PositionSeekStreamNotSupportedException

で後方に移動する必要がある場合は、次のように、インスタンスStreamを作成し、メソッドを介して応答を にコピーする必要があります。MemoryStreamStreamMemoryStreamCopyTo

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

于 2012-05-15T18:41:53.063 に答える