C# 将变量推入方法
我有一个httpWebRequest来访问XML并将其保存在本地,然后读取它并将其显示在屏幕上。问题是,我必须为多个“透视项”执行此操作,而保存xml的方法是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
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();
}
以下是您可以做的两件事:
异步状态
然后,用法更改为
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;