Article
The C# OData integration example with correct BPMSESSIONID, CSRF and Cookies
01:03 Feb 07, 2019
You'll need to adjust it to your needs, but it shows the main idea.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Xml;
using System.Xml.Linq;
using System.Drawing;
using System.Net.Http;
namespace ODataFileTransfer
{
class ODataFileTransfer
{
private const string serverUri = "https://014246-studio.bpmonline.com/0/ServiceModel/EntityDataService.svc/";
private const string authServiceUri = "https://014246-studio.bpmonline.com/ServiceModel/AuthService.svc/Login";
private const string userName = "Supervisor";
private const string userPassword = "Supervisor";
private static readonly XNamespace ds = "http://schemas.microsoft.com/ado/2007/08/dataservices";
private static readonly XNamespace dsmd = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
private static readonly XNamespace atom = "http://www.w3.org/2005/Atom";
public static CookieContainer AuthCookie = new CookieContainer();
private static string CsrfToken = "";
private static int LoginAttempts = 0;
static void Main(string[] args)
{
GetOdataCollectionByAuthByHttpExample();
}
static void TryLogin()
{
var authRequest = HttpWebRequest.Create(authServiceUri) as HttpWebRequest;
authRequest.Method = "POST";
authRequest.ContentType = "application/json";
authRequest.CookieContainer = AuthCookie;
using (var requestStream = authRequest.GetRequestStream())
{
using (var writer = new StreamWriter(requestStream))
{
writer.Write(@"{
""UserName"":""" + userName + @""",
""UserPassword"":""" + userPassword + @""",
""SolutionName"":""TSBpm"",
""TimeZoneOffset"":-120,
""Language"":""En-us""
}");
}
}
using (var response = (HttpWebResponse)authRequest.GetResponse())
{
CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
CsrfToken = cookieCollection["BPMCSRF"].Value;
}
}
static HttpWebResponse SendRequest(string requestURIstring, string method = "GET", XElement entry = null)
{
var dataRequest = HttpWebRequest.Create(requestURIstring) as HttpWebRequest;
dataRequest.Method = method;
dataRequest.CookieContainer = AuthCookie;
dataRequest.Accept = "application/atom+xml";
dataRequest.ContentType = "application/atom+xml;type=entry";
dataRequest.Headers.Add("BPMCSRF", CsrfToken);
if (entry!= null)
{
using (var writer = XmlWriter.Create(dataRequest.GetRequestStream()))
{
entry.WriteTo(writer);
}
}
try
{
var dataResponse = (HttpWebResponse)dataRequest.GetResponse();
LoginAttempts = 0;
return dataResponse;
}
catch (WebException ex)
{
var webResponse = (HttpWebResponse)ex.Response;
if (webResponse != null && webResponse.StatusCode == HttpStatusCode.Unauthorized)
{
TryLogin();
if(LoginAttempts < 3)
{
LoginAttempts += 1;
SendRequest(requestURIstring);
}
else
{
//here can be some handler or logger
}
}
}
return null;
}
public static void GetOdataCollectionByAuthByHttpExample()
{
var uri = serverUri + "ContactCollection?select=Id, Name";
using (var dataResponse = SendRequest(uri))
{
if (dataResponse != null)
{
XDocument xmlDoc = XDocument.Load(dataResponse.GetResponseStream());
ProcessCollection(xmlDoc);
}
}
using (var dataResponse = SendRequest(uri))
{
if (dataResponse != null)
{
XDocument xmlDoc = XDocument.Load(dataResponse.GetResponseStream());
ProcessCollection(xmlDoc);
}
}
var content = new XElement(dsmd + "properties",
new XElement(ds + "Name", "Jhon Gilts"),
new XElement(ds + "Dear", "Jhon"));
var entry = new XElement(atom + "entry",
new XElement(atom + "content",
new XAttribute("type", "application/xml"), content));
var uriForPost = serverUri + "ContactCollection/";
using (var dataResponse = SendRequest(uriForPost, "POST", entry))
{
if (dataResponse != null)
{
XDocument xmlDoc = XDocument.Load(dataResponse.GetResponseStream());
}
}
}
public static void ProcessCollection(XDocument xmlDoc)
{
var contacts = from entry in xmlDoc.Descendants(atom + "entry")
select new
{
Id = new Guid(entry.Element(atom + "content")
.Element(dsmd + "properties")
.Element(ds + "Id").Value),
Name = entry.Element(atom + "content")
.Element(dsmd + "properties")
.Element(ds + "Name").Value
};
foreach (var contact in contacts)
{
// Implementing actions with contacts.
}
}
}
}
Enjoy.