Vamos al asunto. Me he creado una clase llamada SPAuthBridge partiend del código de la SDK que puede ser usada para realizar las conexiones con el servidor de SharePoint.
- 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
- }
- }
La manera de usar esto es bastante simple, creas el objeto SPAuthBridge y, llamas al método Authenticate y listo, algo así:
- 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();
- }
Es precioso
(Por cierto, las gráficas son de AmCharts)
No hay comentarios:
Publicar un comentario