Connecting from a .NET client via the Web Services binding
This is a very simple C# example that demonstrates how to connect to an OpenCMIS server via the Web Services binding. Please note that .NET only allows UsernameTokens over HTTPS.
(See also DotCMIS).
using System;
using System.ServiceModel;
using OpenCMISClient.OpenCMISServer;
using System.Net;
namespace OpenCMISClient
{
class CMISClientDemo
{
public void DoStuff()
{
try
{
// uncomment the next line if you are using a self signed SSL certificate
// ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
// get hold of the services
RepositoryServicePortClient repService = GetRepositoryService("https://localhost:8443/opencmis/services/RepositoryService?wsdl", "test", "test");
NavigationServicePortClient navService = GetNavigationService("https://localhost:8443/opencmis/services/NavigationService?wsdl", "test", "test");
ObjectServicePortClient objService = GetObjectService("https://localhost:8443/opencmis/services/ObjectService?wsdl", "test", "test");
// get the list of repositories
cmisRepositoryEntryType[](.html) repositoryEntries = repService.getRepositories(null);
foreach (cmisRepositoryEntryType repositoryEntry in repositoryEntries)
{
Console.WriteLine("Repository: " + repositoryEntry.repositoryName + " (" + repositoryEntry.repositoryId + ")");
// get repository info
cmisRepositoryInfoType repositoryInfo = repService.getRepositoryInfo(repositoryEntry.repositoryId, null);
Console.WriteLine(" Info:");
Console.WriteLine(" Description: " + repositoryInfo.repositoryDescription);
Console.WriteLine(" Product: " + repositoryInfo.vendorName + " / " + repositoryInfo.productName + " " + repositoryInfo.productVersion);
// get all base types of the repository
cmisTypeDefinitionListType typeList = repService.getTypeChildren(repositoryInfo.repositoryId, null, true, null, null, null);
Console.WriteLine(" Types:");
foreach (cmisTypeDefinitionType type in typeList.types)
{
Console.WriteLine(" " + type.displayName + " (" + type.id + ")");
}
// get all root folder children
cmisObjectInFolderListType children = navService.getChildren(repositoryInfo.repositoryId, repositoryInfo.rootFolderId, null, null, true, null, null, false, null, null, null);
Console.WriteLine(" Root folder:");
foreach (cmisObjectInFolderType objInFolder in children.objects)
{
cmisObjectType obj = objInFolder.@object;
String objId = GetIdPropertyValue(obj.properties, "cmis:objectId");
Console.WriteLine(" Name: " + GetStringPropertyValue(obj.properties, "cmis:name") + " (" + objId + ")");
Console.WriteLine(" Type: " + GetIdPropertyValue(obj.properties, "cmis:baseTypeId"));
Console.WriteLine(" Created by: " + GetStringPropertyValue(obj.properties, "cmis:createdBy"));
Console.WriteLine(" Creation date: " + GetDateTimePropertyValue(obj.properties, "cmis:creationDate"));
// if it is a document, get the size and the content
String baseType = GetIdPropertyValue(obj.properties, "cmis:baseTypeId");
if ("cmis:document".Equals(baseType))
{
// get the size
Int64? size = GetIntegerPropertyValue(obj.properties, "cmis:contentStreamLength");
Console.WriteLine(" Size: " + size);
// get the content
cmisContentStreamType content = objService.getContentStream(repositoryInfo.repositoryId, objId, null, null, null, null);
Console.WriteLine(" MIME type: " + content.mimeType);
// get the "stream"
byte[]bytes = content.stream; // really streaming requires some more work
Console.WriteLine(" Stream: " + (bytes.Length == size ? "ok" : "mismatch"));
}
}
}
}
catch (FaultException<cmisFaultType> fe)
{
Console.WriteLine("CMIS Exception: " + fe.Detail.message);
Console.WriteLine("Type: " + fe.Detail.type);
Console.WriteLine("Code: " + fe.Detail.code);
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
Console.WriteLine(e.StackTrace);
}
Console.ReadKey();
}
public RepositoryServicePortClient GetRepositoryService(String wsdlUrl, String user, String password)
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.MessageEncoding = WSMessageEncoding.Mtom;
binding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
RepositoryServicePortClient service = new RepositoryServicePortClient(binding, new EndpointAddress(wsdlUrl));
service.ClientCredentials.UserName.UserName = user;
service.ClientCredentials.UserName.Password = password;
return service;
}
public NavigationServicePortClient GetNavigationService(String wsdlUrl, String user, String password)
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.MessageEncoding = WSMessageEncoding.Mtom;
binding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
NavigationServicePortClient service = new
NavigationServicePortClient(binding, new EndpointAddress(wsdlUrl));
service.ClientCredentials.UserName.UserName = user;
service.ClientCredentials.UserName.Password = password;
return service;
}
public ObjectServicePortClient GetObjectService(String wsdlUrl, String user, String password)
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.MessageEncoding = WSMessageEncoding.Mtom;
binding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
binding.TransferMode = TransferMode.Streamed;
ObjectServicePortClient service = new ObjectServicePortClient(binding, new EndpointAddress(wsdlUrl));
service.ClientCredentials.UserName.UserName = user;
service.ClientCredentials.UserName.Password = password;
return service;
}
public String GetStringPropertyValue(cmisPropertiesType properties, String id)
{
String result = null;
foreach (cmisProperty property in properties.Items)
{
if (property.propertyDefinitionId.Equals(id))
{
if (property is cmisPropertyString)
{
result = ((cmisPropertyString)property).value[0](0.html);
}
break;
}
}
return result;
}
public String GetIdPropertyValue(cmisPropertiesType properties, String id)
{
String result = null;
foreach (cmisProperty property in properties.Items)
{
if (property.propertyDefinitionId.Equals(id))
{
if (property is cmisPropertyId)
{
result = ((cmisPropertyId)property).value[0](0.html);
}
break;
}
}
return result;
}
public Int64? GetIntegerPropertyValue(cmisPropertiesType properties, String id)
{
Int64? result = null;
foreach (cmisProperty property in properties.Items)
{
if (property.propertyDefinitionId.Equals(id))
{
if (property is cmisPropertyInteger)
{
result = Int64.Parse(((cmisPropertyInteger)property).value[0](0.html));
}
break;
}
}
return result;
}
public DateTime? GetDateTimePropertyValue(cmisPropertiesType properties, String id)
{
DateTime? result = null;
foreach (cmisProperty property in properties.Items)
{
if (property.propertyDefinitionId.Equals(id))
{
if (property is cmisPropertyDateTime)
{
result = ((cmisPropertyDateTime)property).value[0](0.html);
}
break;
}
}
return result;
}
}
}