Prikazani su postovi s oznakom facebook. Prikaži sve postove
Prikazani su postovi s oznakom facebook. Prikaži sve postove

utorak, 2. srpnja 2013.

ASP.NET MVC4 Facebook app GetCurrentUserAsync problem with custom fields and how to locate an error

OK - my next problem: I tried to add some additional fields into a class with whom I model friends of my app user. I assumed, additional fields will be automatically ignored (either by facebook or by api) - they weren't. Suppose we have a class:

public class FbFriend
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Link { get; set; }

    public User AppUser { get; set; }
}

The field "AppUser" will be initialized right after the request if my FbFriend is an user in my application. However, I was constantly getting an error. Even worse - I couldn't see wher the exception occured. For instance, I had this code:

var task = ctx.Client.GetCurrentUserAsync<FbUser>();
task.Wait();

var user = task.Result;

And all that I could see is that my user object had all nulls for fields. First step is seeing how to locate an error - assuming one develops with Visual Studio 2012, here is the screenshot:

Using mouse over on your context object, navigate to http request:


Copy paste entire URL into browser and read the result:


In my case, field AppUser is unknown. The last step is to tell the Facebook.Mvc to ignore field AppUser. It does not work with IgnoreDataMember, nor it works with NonSerialized attribute, but works only with JsonIgnore:
public class FbFriend
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Link { get; set; }

    [JsonIgnore]
    public User AppUser { get; set; }
}
Problem: [solved].

srijeda, 26. lipnja 2013.

ASP.NET MVC4 Facebook application, facebook authorization and form post data

OK - so I've seen this great tutiral on creating Facebook app's with ASP.NET MVC4. I figured - this will be peace of cake - I have a cool idea which I'm about to implement, and just follow this steps and everything should work. However, this is never true. First thing I stumbled upon were simple post-forms. The problem is when one uses FacebookAuthorize attribute on an action or a controller, and attempts a simple post to this page, it simply doesn't work! The problem is further described in this stackoverflow question

Basically, the problem is because for some reason FacebookAuthorize filter makes a redirect to check the identity of an user. It took me at least 2 hours to find a reason for this behaviour - the code is actually available online to see, on this github link. The solution lies in code between lines 50 and 60 - FacebookAuthorize checks if there exists a specific request parameter, named "signed_request", and if it does not exist, the redirect is made and all our post data is lost.

The best solution I could come up is making a simple hidden field inside our form which is named "signed_request" and contains this request. For that purpose, I've made this nice extender method that does the job:


public static class FacebookHelpers
    {
        public static MvcHtmlString RenderAuthorizationToken(this HtmlHelper helper)
        {
            var signedReqValue = helper.ViewContext.RequestContext.HttpContext.Request["signed_request"];

            TagBuilder hdnBilder = new TagBuilder("input");
            hdnBilder.Attributes.Add("type", "hidden");
            hdnBilder.Attributes.Add("name", "signed_request");
            hdnBilder.Attributes.Add("value", signedReqValue);

            return MvcHtmlString.Create(hdnBilder.ToString(TagRenderMode.SelfClosing));
        }
    }
It can be used like this using razor: @Html.RenderAuthorizationToken()
Problem: [solved].