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