Take the 2-minute tour ×
SharePoint Stack Exchange is a question and answer site for SharePoint enthusiasts. It's 100% free, no registration required.

I'm facing a weird issue with SharePoint 2010 user profile.

I'm storing in the user profile a base 64 string that hold some custom data. As the data may be quite heavy, the profile property has been set to allow multiple string values.

However, when the string starts to grow significantly, SharePoint starts to alter the string values. In my case, a single "S" is transformed to a "s". And after that, as I'm deserializing the string, this make the whole thing to crash.

I was not able to understand when does it occurs, but I have written a small reproduction code :

    [TestMethod()]
    public void ImportFromJson3Test()
    {
        string b64 =
            "AAEAAAD/////AQAAAAAAAAAMAgAAAFVTb1NQLkNHNDIuSW50cmFuZXQsIFZlcnNpb249MS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFs" +
            "LCBQdWJsaWNLZXlUb2tlbj1kY2IxY2UxYmRmYzMwMjUyBAEAAAC2AVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtb" +
            "U29TUC5DRzQyLkludHJhbmV0LldlYlBhcnRzLk15TGlua3NXZWJQYXJ0LlBPQ08uQmFzZUVudGl0eSwgU29TUC5DRzQyLkludHJh" +
            "bmV0LCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49ZGNiMWNlMWJkZmMzMDI1Ml1dAwAA" +
            "AAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAA8U29TUC5DRzQyLkludHJhbmV0LldlYlBhcnRzLk15TGlua3NXZWJQYXJ0LlBPQ08u" +
            "QmFzZUVudGl0eVtdAgAAAAgICQMAAAASAAAAAgAAAAcDAAAAAAEAAAAsAAAABDpTb1NQLkNHNDIuSW50cmFuZXQuV2ViUGFydHMu" +
            "TXlMaW5rc1dlYlBhcnQuUE9DTy5CYXNlRW50aXR5AgAAAAkEAAAACQUAAAAJBgAAAAkHAAAACQgAAAAJCQAAAAkKAAAACQsAAAAJ" +
            "DAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAACREAAAAJEgAAAAkTAAAACRQAAAAJFQAAAAkWAAAACRcAAAAJGAAAAAkZAAAACRoAAAAJ" +
            "GwAAAAkcAAAACR0AAAAJHgAAAAkfAAAACSAAAAAJIQAAAAkiAAAACSMAAAAJJAAAAAklAAAACSYAAAAJJwAAAAkoAAAACSkAAAAJ" +
            "KgAAAAkrAAAACSwAAAAJLQAAAAkuAAAACS8AAAAFBAAAADRTb1NQLkNHNDIuSW50cmFuZXQuV2ViUGFydHMuTXlMaW5rc1dlYlBh" +
            "cnQuUE9DTy5MaW5rAwAAABQ8VXJsPmtfX0JhY2tpbmdGaWVsZB5CYXNlRW50aXR5KzxJRD5rX19CYWNraW5nRmllbGQhQmFzZUVu" +
            "dGl0eSs8VGl0bGU+a19fQmFja2luZ0ZpZWxkAQMBC1N5c3RlbS5HdWlkAgAAAAYwAAAADmh0dHA6Ly9zb3NwLmZyBM////8LU3lz" +
            "dGVtLkd1aWQLAAAAAl9hAl9iAl9jAl9kAl9lAl9mAl9nAl9oAl9pAl9qAl9rAAAAAAAAAAAAAAAIBwcCAgICAgICAh+iRvAO9vBM" +
            "sPN0PER2gKoGMgAAAAZzb3NwNDMBBQAAAAQAAAAGMwAAAA5odHRwOi8vc29zcC5mcgHM////z////9y06h1lQ1dHnzuaHgIIFhsG" +
            "NQAAAAZzb3NwNDIBBgAAAAQAAAAGNgAAAA5odHRwOi8vc29zcC5mcgHJ////z////+y+t694g/JGhdZZpU0VhHUGOAAAAAZzb3Nw" +
            "NDEBBwAAAAQAAAAGOQAAAA5odHRwOi8vc29zcC5mcgHG////z////6QjZ/hJSR1GiUefKnLYwKUGOwAAAAZzb3NwNDABCAAAAAQA" +
            "AAAGPAAAAA5odHRwOi8vc29zcC5mcgHD////z////1ZrGDBsJ0tChc7J5pvxw8AGPgAAAAZzb3NwMzkBCQAAAAQAAAAGPwAAAA5o" +
            "dHRwOi8vc29zcC5mcgHA////z/////h/QJ5zxLhEul9T13nNl7UGQQAAAAZzb3NwMzgBCgAAAAQAAAAGQgAAAA5odHRwOi8vc29z" +
            "cC5mcgG9////z////wQ8qaG2R0hGhcC3+9GXBQIGRAAAAAZzb3NwMzcBCwAAAAQAAAAGRQAAAA5odHRwOi8vc29zcC5mcgG6////" +
            "z////1vgAiwiOVpLu0U9cl/dxgAGRwAAAAZzb3NwMzYBDAAAAAQAAAAGSAAAAA5odHRwOi8vc29zcC5mcgG3////z////2dIVXeD" +
            "Ut1CqNKg6Rffs6sGSgAAAAZzb3NwMzUBDQAAAAQAAAAGSwAAAA5odHRwOi8vc29zcC5mcgG0////z////65X8UZuvjhEuSLIoaOw" +
            "lKsGTQAAAAZzb3NwMzQBDgAAAAQAAAAGTgAAAA5odHRwOi8vc29zcC5mcgGx////z////8jjMeORKX1Lg7UV06evnzUGUAAAAAZz" +
            "b3NwMzMBDwAAAAQAAAAGUQAAAA5odHRwOi8vc29zcC5mcgGu////z////yoLo/IktWVHvK8R9g8Z+UQGUwAAAAZzb3NwMzIBEAAA" +
            "AAQAAAAGVAAAAA5odHRwOi8vc29zcC5mcgGr////z////1be7zBvcLpCmkKeY0/8JlAGVgAAAAZzb3NwMzEBEQAAAAQAAAAGVwAA" +
            "AA5odHRwOi8vc29zcC5mcgGo////z////+SXnzOmi9FDl5VbfjJZa6gGWQAAAAZzb3NwMzABEgAAAAQAAAAGWgAAAA5odHRwOi8v" +
            "c29zcC5mcgGl////z////61G9H2DdM9EvvDTIIEG050GXAAAAAZzb3NwMjkBEwAAAAQAAAAGXQAAAA5odHRwOi8vc29zcC5mcgGi" +
            "////z////7zW8a7QULpIuMBaM2NU5DgGXwAAAAZzb3NwMjgBFAAAAAQAAAAGYAAAAA5odHRwOi8vc29zcC5mcgGf////z////5ya" +
            "8MNyBLpDg8a9aSm9YkQGYgAAAAZzb3NwMjcBFQAAAAQAAAAGYwAAAA5odHRwOi8vc29zcC5mcgGc////z////8khACJhlYpNtDam" +
            "N3J4osMGZQAAAAZzb3NwMjYBFgAAAAQAAAAGZgAAAA5odHRwOi8vc29zcC5mcgGZ////z////5HaoYWJOz5OnTDMUQEhAhEGaAAA" +
            "AAZzb3NwMjUBFwAAAAQAAAAGaQAAAA5odHRwOi8vc29zcC5mcgGW////z////0i2gFTJQaZAp8rsEi6r3xEGawAAAAZzb3NwMjQB" +
            "GAAAAAQAAAAGbAAAAA5odHRwOi8vc29zcC5mcgGT////z////69Din/hIPVIlVBFK/heBqgGbgAAAAZzb3NwMjMBGQAAAAQAAAAG" +
            "bwAAAA5odHRwOi8vc29zcC5mcgGQ////z/////wOkE7aTuxIhMZ2tLlJUysGcQAAAAZzb3NwMjIBGgAAAAQAAAAGcgAAAA5odHRw" +
            "Oi8vc29zcC5mcgGN////z////0WSzWpq0JBEun5GFfi0AnUGdAAAAAZzb3NwMjEBGwAAAAQAAAAGdQAAAA5odHRwOi8vc29zcC5m" +
            "cgGK////z////8ZdEibE7RdGqCA5DT4uXOsGdwAAAAZzb3NwMjABHAAAAAQAAAAGeAAAAA5odHRwOi8vc29zcC5mcgGH////z///" +
            "/yzc8otZ4K9OpyEpX+Mf8YoGegAAAAZzb3NwMTkBHQAAAAQAAAAGewAAAA5odHRwOi8vc29zcC5mcgGE////z////4AuqijW/xRP" +
            "n8FwIETBAE8GfQAAAAZzb3NwMTgBHgAAAAQAAAAGfgAAAA5odHRwOi8vc29zcC5mcgGB////z////2ZR1x2qqnBAlKsM8Cu/ElEG" +
            "gAAAAAZzb3NwMTcBHwAAAAQAAAAGgQAAAA5odHRwOi8vc29zcC5mcgF+////z////47Q3VWxc11Pv9UDEiLwU6YGgwAAAAZzb3Nw" +
            "MTYBIAAAAAQAAAAGhAAAAA5odHRwOi8vc29zcC5mcgF7////z////+0wWflym8JFiUl8RyI6bSUGhgAAAAZzb3NwMTUBIQAAAAQA" +
            "AAAGhwAAAA5odHRwOi8vc29zcC5mcgF4////z////xi1jdHkS55EuCov9WyjfGgGiQAAAAZzb3NwMTQBIgAAAAQAAAAGigAAAA5o" +
            "dHRwOi8vc29zcC5mcgF1////z////7ZzzL1ThF9IpZCO+Bd+adcGjAAAAAZzb3NwMTMBIwAAAAQAAAAGjQAAAA5odHRwOi8vc29z" +
            "cC5mcgFy////z////4cZ8/EMPzRKlBQ9jUjUerYGjwAAAAZzb3NwMTIBJAAAAAQAAAAGkAAAAA5odHRwOi8vc29zcC5mcgFv////" +
            "z////x3jdau8OERCltBnr6KRkcsGkgAAAAZzb3NwMTEBJQAAAAQAAAAGkwAAAA5odHRwOi8vc29zcC5mcgFs////z////1qNe+3f" +
            "LJ5EtZhWzr/Bcb0GlQAAAAZzb3NwMTABJgAAAAQAAAAGlgAAAA5odHRwOi8vc29zcC5mcgFp////z////wSspqzj/BdOhES74OcG" +
            "p+oGmAAAAAVzb3NwOQEnAAAABAAAAAaZAAAADmh0dHA6Ly9zb3NwLmZyAWb////P////fx0ShxPJhUKDCD7ioAaEXgabAAAABXNv" +
            "c3A4ASgAAAAEAAAABpwAAAAOaHR0cDovL3Nvc3AuZnIBY////8////+dZNSBpNJsSK7dGh9RD1wABp4AAAAFc29zcDcBKQAAAAQA" +
            "AAAGnwAAAA5odHRwOi8vc29zcC5mcgFg////z////4AJ6irtVYZNmUfJH5NSDeQGoQAAAAVzb3NwNgEqAAAABAAAAAaiAAAADmh0" +
            "dHA6Ly9zb3NwLmZyAV3////P////8L90EyjU1kGfilAPmR1zygakAAAABXNvc3A1ASsAAAAEAAAABqUAAAAOaHR0cDovL3Nvc3Au" +
            "ZnIBWv///8////+2T8PkV5rzS58pDtQco1eJBqcAAAAFc29zcDQBLAAAAAQAAAAGqAAAAA5odHRwOi8vc29zcC5mcgFX////z///" +
            "/8wQJ7BLuD5Mk/MOSJuqKDwGqgAAAAVzb3NwMwEtAAAABAAAAAarAAAADmh0dHA6Ly9zb3NwLmZyAVT////P////L5nUfHcK8k27" +
            "2Mgt6Ex+NAatAAAABXNvc3AyAS4AAAAEAAAABq4AAAAOaHR0cDovL3Nvc3AuZnIBUf///8////+rZH1GGG0sSI5W6b6IuIAjBrAA" +
            "AAAFc29zcDEBLwAAAAQAAAAGsQAAAA5odHRwOi8vc29zcC5mcgFO////z////wEUPTdIN99CrSfeD0Q8OBQGswAAAAVzb3NwMAs=";

        string[] b64Arr = Split(b64, 255).ToArray();

        using (var site = new SPSite("http://someserver/sites/somesite"))
        {
            using (var web = site.OpenWeb(""))
            {
                var user = web.EnsureUser(@"domain\user");

                var profile = user.GetProfile();

                var prop = profile.GetProfileValueCollection("MyLinks");
                prop.Clear();
                foreach (var item in b64Arr)
                {
                    prop.Add(item);
                }

                profile.Commit();
            }
        }
        using (var site = new SPSite("http://someserver/sites/somesite"))
        {
            using (var web = site.OpenWeb(""))
            {
                var user = web.EnsureUser(@"domain\user");

                var profile = user.GetProfile();

                var result = profile.GetProfileValueCollection("MyLinks").Cast<string>().ToList();

                CollectionAssert.AreEqual(b64Arr.ToList(), result);
            }
        }
    }

    private static IEnumerable<string> Split(string str, int chunkSize)
    {
        int numberRead = 0;

        while (true)
        {
            var remaining = str.Substring(numberRead);

            if (remaining.Length <= chunkSize)
            {
                yield return remaining;
                break;
            }
            else
            {
                yield return remaining.Substring(0, chunkSize);
                numberRead += chunkSize;
            }
        }
    }
    public static UserProfile GetProfile(SPUser user)
    {
        if (user == null) throw new ArgumentNullException("user");
        var spc = SPServiceContext.GetContext(user.ParentWeb.Site);

        var mgr = new UserProfileManager(spc);
        if (mgr.UserExists(user.LoginName))
        {
            return mgr.GetUserProfile(user.LoginName);
        }
        else
        {
            return null;
        }
    }

In order to run this test, first create a user profile property "MyLinks", of type string and that accepts multiples values.

You should also specify a user that have a profile.

Does anyone has yet faced such issue? How did you solved it?

PS: cross posted on MSDN forum

share|improve this question
1  
I would look into the byte total. Isn't there some limit of 5140bytes I have this number stuck in my head. More bytes having to be sent in multiple requests. –  Hugh Wood Apr 26 '13 at 15:03
    
There's a limit in the length of each string in the array, but not the array length (tested with 255KB of data) –  Steve B Apr 26 '13 at 15:36
add comment

1 Answer

up vote 1 down vote accepted

OMG. Thanks to the Managed Metadata Service, that will store behind the scene the profile property, I cannot differentiate values different only by the case.

Then I can simply reproduce the problem with a simpler code:

        string b64 =
            "AAAaaa";
        string[] b64Arr = Split(b64, 3).ToArray();

This will fail, because AAA and aaa are the same.

Then, in order to "fix" the code, I'll have to prefix all my lines with the index in the array, to ensure different values.

The updated code is :

    [TestMethod()]
    public void ImportFromJson3Test()
    {            
        string b64 =
            "AAAAAAAAAAAAAAAAaaaaaaaaaaaaaaaa";
        string[] b64Arr = Split(b64, 3).ToArray();

        using (var site = new SPSite("http://someserver/sites/somesite"))
        {
            using (var web = site.OpenWeb(""))
            {
                var user = web.EnsureUser(@"domain\user");

                var profile = user.GetProfile();

                var prop = profile.GetProfileValueCollection("MyLinks");
                prop.Clear();
                for (int i = 0; i < b64Arr.Length; i++)
                {
                    prop.Add(i.ToString("00000") + b64Arr[i]);
                }

                profile.Commit();
            }
        }
        using (var site = new SPSite("http://someserver/sites/somesite"))
        {
            using (var web = site.OpenWeb(""))
            {
                var user = web.EnsureUser(@"domain\user");



                var profile = user.GetProfile();

                var result = profile.GetProfileValueCollection("MyLinks")
                    .Cast<string>()
                    .Select(str => str.Substring(5))
                    .ToList();

                CollectionAssert.AreEqual(b64Arr.ToList(), result);
            }
        }
    }
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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