Let's go to the matter. I created a class called SPAuthBridge from the code in the SDK that can be used to set up the connections to the SharePoint server.
using System; using System.IO; using System.Net; using System.Text; namespace PhoneUtils.Code { public class SPAuthBridge { #region Properties public CookieContainer cookieJar = new CookieContainer(); string SiteUrl, User; string Password; //This should be securestring, but I don't think it's available in WP7 #endregion #region Constructors public SPAuthBridge(string SiteUrl, string User, string Password) { this.SiteUrl = SiteUrl; this.User = User; this.Password = Password; } #endregion #region Public Methods public void Authenticate() { try { if (string.IsNullOrEmpty(SiteUrl)) throw new ArgumentOutOfRangeException("The SPAuthBridge was not properly initialized"); System.Uri authServiceUri = new Uri(string.Format("{0}/_vti_bin/authentication.asmx", SiteUrl)); HttpWebRequest spAuthReq = HttpWebRequest.Create(authServiceUri) as HttpWebRequest; spAuthReq.CookieContainer = cookieJar; spAuthReq.Headers["SOAPAction"] = "http://schemas.microsoft.com/sharepoint/soap/Login"; spAuthReq.ContentType = "text/xml; charset=utf-8"; spAuthReq.Method = "POST"; //add the soap message to the request spAuthReq.BeginGetRequestStream(new AsyncCallback(spAuthReqCallBack), spAuthReq); } catch { TriggerOnAuthenticated(false); } } #endregion #region Private Methods private void spAuthReqCallBack(IAsyncResult asyncResult) { string envelope = @"<?xml version=""1.0"" encoding=""utf-8""?> <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Body> <Login xmlns=""http://schemas.microsoft.com/sharepoint/soap/""> <username>{0}</username> <password>{1}</password> </Login> </soap:Body> </soap:Envelope>"; UTF8Encoding encoding = new UTF8Encoding(); HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; Stream _body = request.EndGetRequestStream(asyncResult); envelope = string.Format(envelope, User, Password); byte[] formBytes = encoding.GetBytes(envelope); _body.Write(formBytes, 0, formBytes.Length); _body.Close(); request.BeginGetResponse(new AsyncCallback(ResponseCallback), request); } private void ResponseCallback(IAsyncResult asyncResult) { try { HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult); Stream content = response.GetResponseStream(); if (request != null && response != null) { if (response.StatusCode == HttpStatusCode.OK) { using (StreamReader reader = new StreamReader(content)) { //Put debugging code here string _responseString = reader.ReadToEnd(); reader.Close(); } } } //authentication complete TriggerOnAuthenticated(true); } catch { TriggerOnAuthenticated(false); } } #endregion #region Events public delegate void OnAuthenticatedHandler(bool Success); public event OnAuthenticatedHandler OnAuthenticated; protected virtual void TriggerOnAuthenticated(bool Success) { if (OnAuthenticated != null) OnAuthenticated(Success); } #endregion } }
The way to use this class is fairly simple, you create the SPAuthBridge object, you call the Authenticate method and you are ready to go, something like this:
StratexWP7SoapClient StratexWP7 = new StratexWP7SoapClient(); //This is my web service SPAuthBridge SharePointAuth; public MainPage() { InitializeComponent(); (...) SharePointAuth = new SPAuthBridge(SiteUrl, Username, Password); SharePointAuth.OnAuthenticated += new SPAuthBridge.OnAuthenticatedHandler(SharePointAuth_OnAuthenticated); if (!string.IsNullOrEmpty(Password)) SharePointAuth.Authenticate(); else MessageBox.Show("The application should be configured before use."); } void SharePointAuth_OnAuthenticated(bool Success) { if (!Success) { Deployment.Current.Dispatcher.BeginInvoke(() => { MessageBox.Show("There was an error on the authentication procedure. Please check the configuration."); }); return; } StratexWP7.CookieContainer = SharePointAuth.cookieJar; //This is all you have to do to connect your web service. \m/ O.O \m/ HookEvents(); RequestData(); }
It looks great
(By the way the charts are from AmCharts)
No comments:
Post a Comment