Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将变量推入方法_C#_.net_Silverlight_Windows Phone 7 - Fatal编程技术网

C# 将变量推入方法

C# 将变量推入方法,c#,.net,silverlight,windows-phone-7,C#,.net,Silverlight,Windows Phone 7,我有一个httpWebRequest来访问XML并将其保存在本地,然后读取它并将其显示在屏幕上。问题是,我必须为多个“透视项”执行此操作,而保存xml的方法是 private static void GetResponseCallback(IAsyncResult asynchronousResult) 并且不支持向其添加新变量,以便动态命名xml(“tmp”+xmlName+“.xml”) 所以问题是:如何在xml名称中推送变量? public class HttpWebReqMethod

我有一个httpWebRequest来访问XML并将其保存在本地,然后读取它并将其显示在屏幕上。问题是,我必须为多个“透视项”执行此操作,而保存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();
        }

以下是您可以做的两件事:

  • 使GetResponseCallback不是静态的,并将xmlName存储在实例变量中
  • 将一个状态对象(任何具有名为xmlName的属性的对象,以及用于标识它的其他对象)传递给请求,您可以从
    异步状态
  • 将GetResponseCallback的函数更改为以下内容,并将整件事设置为回调“工厂”

  • 编辑以添加:
    然后,用法更改为

     httpRequest.BeginGetRequestStream(GetRequestStreamCallback(xmlName), httpRequest);
    

    它是一个映射到特定委托类型的回调方法,因此不,您不能修改它的签名

    解决此问题的一个选项是使用一个单独的类,例如:

    class HttpRequestState {
        HttpWebRequest httpWebRequest;
        string xmlFileName;
    }
    
    然后,可以在运行Begin回调时将该类的实例设置为状态对象:

    httpRequest.BeginGetRequestStream(新的异步回调(GetRequestStreamCallback),httpRequest)

    将更改为

    httpRequest.BeginGetRequestStream(新的AsyncCallback(GetRequestStreamCallback),新的HttpRequestState(){httpWebRequest=httpRequest;xmlFileName=“tmp”+xmlName+“.xml”})

    当然,您可以像这样取出xmlFileName和httpWebRequest:

    HttpRequestState stateObj = (HttpRequestState)asynchronousResult.AsyncState;
    HttpWebRequest httpRequest = stateObj.httpWebRequest;
    string fileName = xmlFileName;
    

    哦,我知道鲁迪欧·维瑟选择了第二个选项,并且解释得更好:)第三个选项仍然很好,在某些情况下非常有用。你能帮我找到“回调”工厂吗?我得到:GetResponseCallback(string)'返回void,return关键字后面不能跟有响应的对象表达式。我只需要稍微清醒一下:)
    HttpRequestState stateObj = (HttpRequestState)asynchronousResult.AsyncState;
    HttpWebRequest httpRequest = stateObj.httpWebRequest;
    string fileName = xmlFileName;