cancel
Showing results for 
Search instead for 
Did you mean: 

Calling Alfresco Web Services from C#

osho
Champ in-the-making
Champ in-the-making
Hi,

I am starting this topic to share my experience of calling Alfresco Web Services from .Net, the problems which you may face and the solutions.

I first started with scratch. I created a C# project and added a Web reference to AuthenticationService (authentication-service.wsdl) , and VersioningService (VersioningService.wsdl).
Then I wrote following lines of code
            WindowsApplication1.AuthenticationService.AuthenticationService asvc = new WindowsApplication1.AuthenticationService.AuthenticationService();
            AuthenticationResult ar = asvc.startSession("admin", "admin");

It worked fine. Examining ar showed the token returned by Alfresco.
I then wrote the following lines
           VersioningService vs = new VersioningService();
            string repID = ("xyz");
            string docID = ("abc");
            string docRefId = docID;
            bool b = vs.checkOut(repID, ref docRefId);

I was expecting an exception to be generated for giving invalid parameters, but the exception generated was about target service is null. It seems VersioningService is not exposed at URL/alfresco/api/VersioningService.
I then tried to add reference to RepositoryService (repository-service.wsdl ). Visual Studio reported a problem:
The document was understood, but it could not be processed. The WSDL document contains links that could not be resolved.

The solution was to remove the  nillable attributes in cml.xsd files. After doing that, it was able to add the reference. I then wrote the following lines
            RepositoryService rs = new RepositoryService();
            rs.Credentials = asvc.Credentials;
            Store[] stores = rs.getStores();
The exception which got generated was about Unauthorization. It was simple to figure out the cause, I was not passing in the security token, it was hard to figure out how to pass that. I was stuck.

I then googled and found out that there is demo project called dotNet2 for calling Alfresco APIs from .Net. I downloaded the same and tried to build it. It turned out that there was a missing reference to Microsoft.Web.Services3 assembly. Solution was to install MS WSE 3. So well and good.
I tried building the solution and there was a problem:

Error 1 The best overloaded method match for 'WebServiceFactory.addSecurityHeader(Microsoft.Web.Services3.WebServicesClientProtocol)' has some invalid arguments
Error 2 Argument '1': cannot convert from 'Alfresco.RepositoryWebService.RepositoryService' to 'Microsoft.Web.Services3.WebServicesClientProtocol'

I tried google to find out the solution for this, and I got one but it didn't work. A close observation revealed that addSecurityHeader was expecting Microsoft.Web.Services3.WebServicesClientProtocol object the service objects which we were passing were derived from SoapHttpClientProtocol class. I found that Microsoft.Web.Services3.WebServicesClientProtocol itself derives from SoapHttpClientProtocol, so I just let the web services class derive from Microsoft.Web.Services3.WebServicesClientProtocol and it worked!!

Then I tried to call getStores() method of RepositoryWebService and I again encountered exception. There was some problem in class instantiation from the returned response. Close observation again revealed the problem. The StoreEnum of RepositoryWebService was defined like this

    public enum StoreEnum {
        /// <remarks/>
        workspace,
        /// <remarks/>
        versionStore,
        /// <remarks/>
        user,
        /// <remarks/>
        search,
        /// <remarks/>
        http,
        /// <remarks/>
        system,
    }

I extended this enum to look like this


    public enum StoreEnum {
        /// <remarks/>
        workspace,
        /// <remarks/>
        versionStore,
        /// <remarks/>
        user,
        /// <remarks/>
        search,
        /// <remarks/>
        http,
        /// <remarks/>
        system,
        archive,
        avm,
    }

And after doing this, the call succeeded  Smiley Happy
Now my task was to test checking out of a selected file and getting a previous version of a selected file. After many hit and trials, I got it working and here is the reference code (I added  private AuthoringService authoringService; to Browse class)

This is the code for Checking Out a selected file:

        private void CheckOut_Click(object sender, EventArgs e)
        {
            ListViewItem item = listViewBrowse.SelectedItems[0];
            if (item != null)
            {
                ResultSetRowNode node = item.Tag as ResultSetRowNode;
                if (node != null)
                {
                    if (node.type.Contains("folder") == false)
                    {
                        // Create the reference for the node selected
                        Alfresco.AuthoringWebService.Store spacesStore2 = new Alfresco.AuthoringWebService.Store();
                        spacesStore2.scheme = Alfresco.AuthoringWebService.StoreEnum.workspace;
                        spacesStore2.address = "SpacesStore";

                        Alfresco.AuthoringWebService.Reference reference = new Alfresco.AuthoringWebService.Reference();
                        reference.store = spacesStore2;
                        reference.uuid = node.id;

                        // Lets try to check out
                        Alfresco.AuthoringWebService.Predicate predicate = new Alfresco.AuthoringWebService.Predicate();
                        predicate.Items = new Object[] { reference };
                        Alfresco.AuthoringWebService.ParentReference pr = new Alfresco.AuthoringWebService.ParentReference();
                        pr.store = spacesStore2; ;
                        pr.uuid = this.currentReference.uuid;
                        pr.associationType = Constants.ASSOC_CONTAINS;
                        pr.childName = Constants.createQNameString(Constants.NAMESPACE_CONTENT_MODEL, item.Text);
                        this.authoringService.checkout(predicate, pr);
                    }
                    else
                    {
                         // show message that a folder has been selected
                    }
                }
            }

        }


And this is the code for getting the original version of a file

        private void GetOriginalVersion_Click(object sender, EventArgs e)
        {
            Alfresco.RepositoryWebService.Store[] stores = this.repoService.getStores();

            Alfresco.RepositoryWebService.Store vStore = stores[3]; // from data, I found out that this is for Versioned store

            ListViewItem item = listViewBrowse.SelectedItems[0];
            if (item != null)
            {
                ResultSetRowNode node = item.Tag as ResultSetRowNode;
                if (node != null)
                {
                    if (node.type.Contains("folder") == false)
                    {
                        // Create the reference for the node selected
                        Alfresco.AuthoringWebService.Store spacesStore2 = new Alfresco.AuthoringWebService.Store();
                        spacesStore2.scheme = Alfresco.AuthoringWebService.StoreEnum.workspace;
                        spacesStore2.address = "SpacesStore";

                        Alfresco.AuthoringWebService.Reference reference = new Alfresco.AuthoringWebService.Reference();
                        reference.store = spacesStore2;
                        reference.uuid = node.id;

                        VersionHistory VH = this.authoringService.getVersionHistory(reference);

                        int i = 0;
                        char[] temp = new char[1];
                        temp[0] = '0';
                        string versions = new string(temp);
                        Alfresco.AuthoringWebService.Version first;
                        foreach (Alfresco.AuthoringWebService.Version version in VH.versions)
                        {
                            if (i == 0)
                                first = version;
                            versions += version.label + (";") + version.id.uuid + (";");
                        }

                        {
                            // Create the reference for the node selected
                            Alfresco.ContentWebService.Store spacesStore3 = new Alfresco.ContentWebService.Store();
                            spacesStore3.scheme = Alfresco.ContentWebService.StoreEnum.versionStore;
                            spacesStore3.address = vStore.address;

                            Alfresco.ContentWebService.Reference reference1 = new Alfresco.ContentWebService.Reference();
                            reference1.store = spacesStore3;
                            reference1.uuid = VH.versions[VH.versions.GetUpperBound(0)].id.uuid;

                            // Lets try and get the content
                            Alfresco.ContentWebService.Predicate predicate = new Alfresco.ContentWebService.Predicate();
                            predicate.Items = new Object[] { reference1 };
                            Content[] contents = this.contentService.read(predicate, "{http://www.alfresco.org/model/content/1.0}content");
                            Content content = contents[0];
                            if (content.url != null && content.url.Length != 0)
                            {
                                string url = content.url + "?ticket=" + AuthenticationUtils.Ticket;
                                webBrowser.Url = new Uri(url);
                            }


                        }

                    }
                    else
                    {
                       // show message that a folder has been selected
                    }
                }
            }


        }
    }
}

I hope this post helps you. If you also found similar or new issues, please post under this thread, so that new comers can have a list of all the problems and solutions at the same place.

-osho
16 REPLIES 16

jamesairey
Champ in-the-making
Champ in-the-making
I am also trying to follow these steps (thanks for posting them - v helpful) but I am falling at the second hurdle.  I don't seem to have a Versioning Service available.

Have I used the wrong version of Alfresco? I don't want to get too far down the line, then have to start again.

osho
Champ in-the-making
Champ in-the-making
Hi jamesairey

In my case also, It seemed that VersioningService is not exposed at URL/alfresco/api/VersioningService. Try using Repository Service instead.

Please let me know if it helped.

-Osho

jamesairey
Champ in-the-making
Champ in-the-making
thanks - lack of ability to read on my part.
i'm not getting much time to try this out.

now the repository-service.wsdl isn't loading properly, so I need to look through some more threads to find the solution to that - i see that there are a few on this topic.

I think i didn't delete the right entries out of my wsdl file, so it either gets rejected by Visual Studio 2008 or it is loaded, but then doesn't generate the code.

Seeing as I'm doing an evaluation of the product at the moment, I am finding this all a bit harder work than I would like.

thaspesl
Champ in-the-making
Champ in-the-making
Dear all,

I'm relatively new to Alfresco and trying to run the dotnet2 demoproject. I just downloaded the most recent version of the project and unpacked it. When I try to build the project (as is) I receive errors concerning
"The best overloaded method match for Alfresco.WebServiceFactory.addSecurityHeader(Microsoft.Web.Services3.WebServicesClientProtocol) has some invalid arguments"
and
"Argument '1': cannot convert from 'Alfresco.RepositoryWebService.RepositoryService' to 'Microsoft.Web.Services3.WebServicesClientProtocol'

If I look in previous posts I find to change the definition of addSecurityHeader but in the latest version of the demoproject this change is already implemented.

Any ideas what (files) should be modified to successfully build the project? (using Community 3.2 and VS 2008 with WSE 3.0)

Thanks in advance
T

osho
Champ in-the-making
Champ in-the-making
Hi thaspesl,

May I know, from where have you downloaded the project.

-Osho

anurag83
Champ in-the-making
Champ in-the-making
hi Osho,
How can i add a web reference to AuthenticationService (authentication-service.wsdl) and VersioningService (VersioningService.wsdl).
i have already setup a C# project, but not getting an option for adding the above services.

Regards,
Anurag

anurag83
Champ in-the-making
Champ in-the-making
Hi All,
I have downloaded the .NET2 code and it seems to work fine.  Smiley Happy
the only issue that is being faced is with the Versioning Code. it is throwing a Runtime exception when I try to get the original version of the file.

The Exception is InvalidOperationException at
Alfresco.RepositoryWebService.Store[] stores = this.repoService.getStores();  in Browse.cs

Can someone suggest a work around.

Thanks,
Anurag