0

XML にアクセスしてローカルに保存し、それを読み取って画面に表示するための httpWebRequest があります。問題は、複数の「ピボット項目」に対してこれを行う必要があり、xml を保存する方法が

private static void GetResponseCallback(IAsyncResult asynchronousResult)

新しい変数の追加をサポートしていないため、xml ("tmp"+xmlName+".xml") に動的に名前を付けることができます。

問題は、xml 名に変数をプッシュするにはどうすればよいかということです。

public class HttpWebReqMethod
    {

        public void httpRequestMethod (string url, string xmlName)
        {     
            HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url);
            httpRequest.ContentType = "text/xml";
            httpRequest.Method = "POST";

            httpRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), httpRequest);
        }

        private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
        {
            HttpWebRequest httpRequest = (HttpWebRequest)asynchronousResult.AsyncState;

            // End the operation
            Stream postStream = httpRequest.EndGetRequestStream(asynchronousResult);


            string postData = "";

            // Convert the string into a byte array.
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            // Write to the request stream.
            postStream.Write(byteArray, 0, postData.Length);
            postStream.Close();

            // Start the asynchronous operation to get the response
            httpRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), httpRequest);
        }

        private static void GetResponseCallback(IAsyncResult asynchronousResult)
        {
            HttpWebRequest httpRequest = (HttpWebRequest)asynchronousResult.AsyncState;

            // End the operation
            HttpWebResponse response = (HttpWebResponse)httpRequest.EndGetResponse(asynchronousResult);
            Stream streamResponse = response.GetResponseStream();
            StreamReader streamRead = new StreamReader(streamResponse);
            string responseStream = streamRead.ReadToEnd();

            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (var istream = new IsolatedStorageFileStream(@"tmp" + xmlName + ".xml", FileMode.OpenOrCreate, store))
                {
                    using (var sw = new StreamWriter(istream))
                    {
                        sw.Write(responseStream);
                    }
                }
            }

            // Close the stream object
            streamResponse.Close();
            streamRead.Close();

            // Release the HttpWebResponse
            response.Close();
        }
4

2 に答える 2

1

これがあなたができる2つのことです:

  1. GetResponseCallbackを静的ではなくし、xmlNameをインスタンス変数に格納します
  2. 状態オブジェクト( xmlNameという名前のプロパティを持つもの、およびそれを識別するための他の何か)をリクエストに渡すと、から取得できます。AsyncState
  3. GetResponseCallbackの関数を次のように変更し、すべてをコールバック「ファクトリ」にします。

    private static AsyncCallback GetResponseCallback(string xmlName)
     {
        return (IAsyncResult asynchronousResult) =>{
        HttpWebRequest httpRequest = (HttpWebRequest)asynchronousResult.AsyncState;
        // End the operation
        HttpWebResponse response = (HttpWebResponse)httpRequest.EndGetResponse(asynchronousResult);
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseStream = streamRead.ReadToEnd();
    
        using (var store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (var istream = new IsolatedStorageFileStream(@"tmp" + xmlName + ".xml", FileMode.OpenOrCreate, store))
            {
                using (var sw = new StreamWriter(istream))
                {
                    sw.Write(responseStream);
                }
            }
        }
    
        // Close the stream object
        streamResponse.Close();
        streamRead.Close();
    
        // Release the HttpWebResponse
        response.Close();
      }
    }
    

編集して追加:
使用法は次のように変更されます

 httpRequest.BeginGetRequestStream(GetRequestStreamCallback(xmlName), httpRequest);
于 2012-05-28T20:23:37.480 に答える
0

これは特定のデリゲートタイプにマップされるコールバックメソッドであるため、いいえ、署名を修正することはできません。

これを解決するための1つのオプションは、次のような別のクラスを持つことです。

class HttpRequestState {
    HttpWebRequest httpWebRequest;
    string xmlFileName;
}

次に、Beginコールバックを実行するときに、そのクラスのインスタンスを状態オブジェクトとして設定できます。

httpRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), httpRequest);

に変更されます

httpRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), new HttpRequestState() { httpWebRequest = httpRequest; xmlFileName = "tmp"+xmlName+".xml" });

そしてもちろん、次のようにxmlFileNamehttpWebRequestを引き出すことができます。

HttpRequestState stateObj = (HttpRequestState)asynchronousResult.AsyncState;
HttpWebRequest httpRequest = stateObj.httpWebRequest;
string fileName = xmlFileName;
于 2012-05-28T20:24:17.083 に答える