问题
My problem is when I use new webclient to send url to the WebService it asks me to login, and after searched about this issue I found that you need to save cookies but its not working with me.
And upon your request this is the full code
namespace PhoneApp8
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
// Sample code to localize the ApplicationBar
//BuildLocalizedApplicationBar();
}
public class OuterRootObject
{
public string d { get; set; }
}
public class Globals
{
public bool MultiSessionsAllowed { get; set; }
public int CommCalcType { get; set; }
public int PriceChangedTimer { get; set; }
public int ValidLotsLocation { get; set; }
public bool CustumizeTradeMsg { get; set; }
public object FirstWhiteLabeledOffice { get; set; }
public int DealerTreePriv { get; set; }
public int ClientConnectTimer { get; set; }
public int ClientTimeoutTimer { get; set; }
public double DefaultLots { get; set; }
public string WebSecurityID { get; set; }
public int ServerGMT { get; set; }
}
public class VersionInfo
{
public int Rel { get; set; }
public int Ver { get; set; }
public int Patch { get; set; }
public int ForceUpdate { get; set; }
public int UpdateType { get; set; }
public Globals Globals { get; set; }
}
public class SystemLockInfo
{
public int MinutesRemaining { get; set; }
public int HoursRemaining { get; set; }
public int DaysRemaining { get; set; }
public int Maintanance { get; set; }
public int WillBeLocked { get; set; }
}
public class RootObject
{
public string sessionid { get; set; }
public VersionInfo VersionInfo { get; set; }
public SystemLockInfo SystemLockInfo { get; set; }
public string FirstWhiteLabel { get; set; }
public string WLID { get; set; }
public bool CheckWhiteLabel { get; set; }
public string Password { get; set; }
public string Username { get; set; }
public DateTime LastTickTime { get; set; }
public int SelectedAccount { get; set; }
public int Name { get; set; }
public object ServicePath { get; set; }
public string GWSessionID { get; set; }
public string IP { get; set; }
public string SessionDateStart { get; set; }
public string CompanyName { get; set; }
public string UserId { get; set; }
public string DemoClient { get; set; }
public string FName { get; set; }
public string SName { get; set; }
public string TName { get; set; }
public string LName { get; set; }
public object Sms { get; set; }
public string isReadOnly { get; set; }
public string SchSms { get; set; }
public string AlertSms { get; set; }
public object Temp { get; set; }
public string GMTOffset { get; set; }
public string SvrGMT { get; set; }
public object ClientType { get; set; }
public string EnableNews { get; set; }
public string PublicSlideNews { get; set; }
public string PrivateSlideNews { get; set; }
public int DealerTreePriv { get; set; }
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string baseuri = "http://IP in the comment/vertexweb10/webservice.svc/login?username=%22user15650%22&password=%22898k%22";
CookieAwareWebClient wc = new CookieAwareWebClient();
wc.DownloadStringCompleted += ParseProducts_AsJson;
Uri uri = new Uri(baseuri);
wc.DownloadStringAsync(uri);
}
private void ParseProducts_AsJson(object sender, DownloadStringCompletedEventArgs e)
{
string raw = e.Result;
string webResponse = e.Result;
MessageBox.Show(webResponse as string);
var outerRoot = JsonConvert.DeserializeObject<OuterRootObject>(webResponse);
var root = JsonConvert.DeserializeObject<RootObject>(outerRoot.d);
MessageBox.Show("hello " + root.Username + " " + root.UserId + " " + root.sessionid);
var UserIdVal= Convert.ToInt16 (root.UserId);
if (UserIdVal == -1 || UserIdVal == -207)
MessageBox.Show("Invalid username or password");
else if (UserIdVal == -231)
{
MessageBox.Show("You must have at least one account");
}
else if (webResponse == null || webResponse == "" || UserIdVal < 0)
{
MessageBox.Show("Error while login.Please try later");
}
else if (UserIdVal > 0)
{
string baseuri1 = "http://IP in the comment/vertexweb10/webservice.svc/getallsymbols?AccountID=1122336675";
CookieAwareWebClient wc1 = new CookieAwareWebClient();
wc1.DownloadStringCompleted += ParseProducts_AsJson1;
Uri uri1 = new Uri(baseuri1);
wc1.DownloadStringAsync(uri1);
MessageBox.Show("You have loged in");
NavigationService.Navigate(new Uri("/page2.xaml", UriKind.Relative));
}
else
{
MessageBox.Show("Invalid username or password");
}
}
private void ParseProducts_AsJson1(object sender, DownloadStringCompletedEventArgs e)
{
string raw1 = e.Result;
string webResponse1 = e.Result;
MessageBox.Show(webResponse1 as string);
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
}
class CookieAwareWebClient : WebClient
{
[System.Security.SecuritySafeCritical]
private CookieContainer cookie;
public CookieContainer Cookie { get { return cookie; } }
public CookieAwareWebClient()
{
cookie = new CookieContainer();
}
public CookieAwareWebClient(CookieContainer givenContainer)
{
cookie = givenContainer;
}
}
}
}
I think the error is in the cookie container, the last cookieaware i use (i have tried more than 10 cookie container codes)
回答1:
This is the code, what it does is it calls the first Url and get response if response is good, it copies the cookie to sessionCookie variable. and uses that in the second call
Declare sessioncookie some where in the same page
public static CookieContainer sessionCookie;
And Copy this in your button click
public static async Task<string> SendRequestGetResponse()
{
try
{
var postRequest = (HttpWebRequest)WebRequest.Create("http://74.54.46.178/vertexweb10/webservice.svc/login?username=%22user15650%22&password=%22898k%22");
postRequest.Method = "GET";
if (sessionCookie == null)
{
postRequest.CookieContainer = new CookieContainer();
}
else
{
postRequest.CookieContainer = sessionCookie;
}
HttpWebResponse postResponse = (HttpWebResponse)await postRequest.GetResponseAsync();
if (postResponse != null)
{
var postResponseStream = postResponse.GetResponseStream();
var postStreamReader = new StreamReader(postResponseStream);
string response = await postStreamReader.ReadToEndAsync();
if (sessionCookie == null)
{
sessionCookie = postRequest.CookieContainer;
}
}
var postRequest1 = (HttpWebRequest)WebRequest.Create("http://74.54.46.178/vertexweb10/webservice.svc/getallsymbols?AccountID=1122336675");
postRequest1.Method = "GET";
if (sessionCookie == null)
{
postRequest1.CookieContainer = new CookieContainer();
}
else
{
postRequest1.CookieContainer = sessionCookie;
}
HttpWebResponse postResponse1 = (HttpWebResponse)await postRequest1.GetResponseAsync();
if (postResponse1 != null)
{
var postResponseStream1 = postResponse1.GetResponseStream();
var postStreamReader1 = new StreamReader(postResponseStream1);
string response1 = await postStreamReader1.ReadToEndAsync();
}
}
}
回答2:
I have solved my problem using
request.CookieContainer = cookieJar;
then i use the same cookieJar on the second request
var request = HttpWebRequest.Create(new Uri("http://x.x.x.x/vertexweb10/webservice.svc/getallsymbols?AccountID=1122336675")) as HttpWebRequest;
request.Method = "GET";
request.CookieContainer = cookieJar;
request.BeginGetResponse(ar =>
{
HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState;
using (var response = (HttpWebResponse)req2.EndGetResponse(ar))
{
using (Stream stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
//the code you need
}
}
}
}, request);
来源:https://stackoverflow.com/questions/22895469/cookies-not-working-using-webclient-on-windows-phone