1

I'm trying to use the Reputation.js setLike method in a sharepoint hosted app/add-in which in theory is possible with the following snippet:

var ctx = new SP.ClientContext(webAppUrl);
Microsoft.Office.Server.ReputationModel.Reputation.setLike(ctx, "73eaae6a-9839-43bd-b509-ddc64989536a", "40", true);
ctx.executeQueryAsync(
    //Success
    Function.createDelegate(this, function () {
        alert("Everything OK!");
    }),
    //Failed to execute, log this in console.
    Function.createDelegate(this, function (e, args) {
        alert("Failed! " + args.get_message());
    })
);

As a result I get an alert with "The assembly Microsoft.SharePoint.Portal.Proxy, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c does not support app authentication."

Is it not possible to Like/Unlike through JSOM? Any pointers or other ways to do this in an app?

0

At last I managed to solve my problem by creating and use a custom WCF service to call the Reputation.SetLike method. Not really the way I would have preferred but in lack of alternatives it was the fastest way forward.

IProxyService.cs

[ServiceContract]
interface IProxyService
{
    [OperationContract]
    [WebInvoke(Method="POST",
        UriTemplate = "LikeArticle?url={url}&listid={listid}&listitemid={listitemid}&like={like}",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare)]
    String LikeArticle(string url, string listid, int listitemid, bool like);
}

ProxyService.svc.cs

public String LikeArticle(string url, string listid, int listitemid, bool like)
    {
        int likes = -1;
        using (var site = new SPSite(url)) {
            using (var web = site.OpenWeb())
            {
                using (new SPContextFaker(HttpContext.Current, SPContext.GetContext(web)))
                {
                    likes = Reputation.SetLike(listid, listitemid, like);
                }
            }
        }

        return ""+likes;
    }

SPContextFaker.cs

public class SPContextFaker : IDisposable
{
    private SPContext _oldSPContext;
    private HttpContext httpContext;
    public SPContextFaker(HttpContext context, SPContext newSPContext)
    {
        _oldSPContext = (SPContext)context.Items["DefaultSPContext"];
        context.Items["DefaultSPContext"] = newSPContext;
        httpContext = context;
    }
    public void Dispose()
    {
        httpContext.Items["DefaultSPContext"] = _oldSPContext;
    }
}

I merged the following two resources in order to create the solution above:

Programmatically like a blog post with Reputation.SetLike Sharepoint 2013

SharePoint 2013: Create a Custom WCF REST Service Hosted in SharePoint and Deployed in a WSP

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.