ฉันต้องการส่งคำขอล่วงหน้าหนึ่งรายการไปยังเซิร์ฟเวอร์ของฉันก่อนที่จะส่งทุกคำขอ จากคำขอล่วงหน้านั้น ฉันจะได้รับโทเค็นจากเซิร์ฟเวอร์ของฉัน และฉันต้องเพิ่มโทเค็นนั้นลงในคำขอทั้งหมด นี่คือกระบวนการ
ฉันได้ลองวิธีการบางอย่างเพื่อให้บรรลุเป้าหมายนี้ แต่ฉันกำลังประสบปัญหาหนึ่ง นั่นคือเมื่อฉันพยายามส่งคำขอล่วงหน้า มันกำลังประมวลผลคำขอปัจจุบัน นั่นหมายถึงคำขอทั้งสองขนานกัน
ฉันต้องการส่งคำขอล่วงหน้าก่อนและแยกวิเคราะห์การตอบกลับ หลังจากแยกวิเคราะห์การตอบกลับคำขอล่วงหน้าแล้วเท่านั้น ฉันต้องการส่งคำขออื่นนั้น แต่คำขอแรกไม่รอการตอบกลับคำขอล่วงหน้า โปรดให้ฉันส่งคำขอล่วงหน้าก่อนที่จะส่งคำขอทั้งหมด
นี่คือรหัสของฉัน:
ดูโมเดล:
`public class ListExampleViewModel
{
SecurityToken sToken = null;
public ListExampleViewModel()
{
GlobalConstants.isGetToken = true;
var listResults = REQ_RESP.postAndGetResponse((new ListService().GetList("xx","xxx")));
listResults.Subscribe(x =>
{
Console.WriteLine("\n\n..................................2");
Console.WriteLine("Received Response==>" + x);
});
}
}`
คลาสคงที่สำหรับคำขอและการตอบสนอง:
`public class REQ_RESP
{
private static string receivedAction = "";
private static string receivedPostDate = "";
public static IObservable<string> postAndGetResponse(String postData)
{
if (GlobalConstants.isGetToken)
{
//Pre Request for every reusest
receivedPostDate = postData;
GlobalConstants.isGetToken = false;
getServerTokenMethod();
postData = receivedPostDate;
}
HttpWebRequest serviceRequest =
(HttpWebRequest)WebRequest.Create(new Uri(Constants.SERVICE_URI));
var fetchRequestStream =
Observable.FromAsyncPattern<Stream>(serviceRequest.BeginGetRequestStream,
serviceRequest.EndGetRequestStream);
var fetchResponse =
Observable.FromAsyncPattern<WebResponse>(serviceRequest.BeginGetResponse,
serviceRequest.EndGetResponse);
Func<Stream, IObservable<HttpWebResponse>> postDataAndFetchResponse = st =>
{
using (var writer = new StreamWriter(st) as StreamWriter)
{
writer.Write(postData);
writer.Close();
}
return fetchResponse().Select(rp => (HttpWebResponse)rp);
};
Func<HttpWebResponse, IObservable<string>> fetchResult = rp =>
{
if (rp.StatusCode == HttpStatusCode.OK)
{
using (var reader = new StreamReader(rp.GetResponseStream()))
{
string result = reader.ReadToEnd();
reader.Close();
rp.GetResponseStream().Close();
XDocument xdoc = XDocument.Parse(result);
Console.WriteLine(xdoc);
return Observable.Return<string>(result);
}
}
else
{
var msg = "HttpStatusCode == " + rp.StatusCode.ToString();
var ex = new System.Net.WebException(msg,
WebExceptionStatus.ReceiveFailure);
return Observable.Throw<string>(ex);
}
};
return
from st in fetchRequestStream()
from rp in postDataAndFetchResponse(st)
from str in fetchResult(rp)
select str;
}
public static void getServerTokenMethod()
{
SecurityToken token = new SecurityToken();
var getTokenResults = REQ_RESP.postAndGetResponse((new ServerToken().GetServerToken()));
getTokenResults.Subscribe(x =>
{
ServerToken serverToken = new ServerToken();
ServiceModel sm = new ServiceModel();
//Parsing Response
serverToken = extract(x, sm);
if (!(string.IsNullOrEmpty(sm.NetErrorCode)))
{
MessageBox.Show("Show Error Message");
}
else
{
Console.WriteLine("\n\n..................................1");
Console.WriteLine("\n\nserverToken.token==>" + serverToken.token);
Console.WriteLine("\n\nserverToken.pk==>" + serverToken.pk);
}
},
ex =>
{
MessageBox.Show("Exception = " + ex.Message);
},
() =>
{
Console.WriteLine("End of Process.. Releaseing all Resources used.");
});
}
}`