Приложение Facebook Canvas с Silverlight 3 не может найти HttpUtility - PullRequest
0 голосов
/ 30 августа 2011

У меня возникла эта крайне неприятная проблема с 5.1.1 Facebook C # SDK.Я успешно загрузил CSSilverlightFacebookApp и подтвердил, что мои настройки Facebook в порядке.Мне удалось заставить тестовое приложение отображаться.

В моем сценарии хостинга я использую следующий пример Google App Engine:

def load_signed_request(signed_request):
"""Load the user state from a signed_request value"""
global APP_ID, APP_SECRET
try:
    sig, payload = signed_request.split(u'.', 1)
    sig = base64_url_decode(sig)
    data = json.loads(base64_url_decode(payload))

    expected_sig = hmac.new(
        APP_SECRET, msg=payload, digestmod=hashlib.sha256).digest()

    # allow the signed_request to function for upto 1 day
    if sig == expected_sig and \
            data[u'issued_at'] > (time.time() - 86400):
        return (data, data.get(u'user_id'), data.get(u'oauth_token'))
except ValueError, ex:
    pass # ignore if can't split on dot

class MainHandler(webapp.RequestHandler):
def post(self):
    global APP_ID, APP_SECRET
    (ignore, ignore, oauth_token) = load_signed_request(self.request.get('signed_request'))
    if oauth_token:
        path = os.path.join(os.path.dirname(__file__), 'templates/silverlight.html')
        params = dict(access_token=oauth_token)
        self.response.out.write(template.render(path, params))

Этот код работает нормально,Я получаю oauth_token в мой код Silverlight.Код ниже работает до последней строки:

var token = "";
        if (App.Current.Resources.Contains("token") && App.Current.Resources["token"] != null)
            token = App.Current.Resources["token"].ToString();
        if (!string.IsNullOrEmpty(token))
        {
            fb = new FacebookClient(token);

            fb.GetCompleted += (o, args) =>
            {
                if (args.Error == null)
                {
                    var result = (IDictionary<string, object>)args.GetResultData();
                    //Dispatcher.BeginInvoke(() => InfoBox.ItemsSource = result);
                }
                else
                {
                    // TODO: Need to let the user know there was an error
                    //failedLogin();
                }
            };

            // Making Facebook call here!
            fb.GetAsync("/me");
        }

На fb.GetAsync ("/ me") я получаю исключение TypeLoadException, сказав, что не может найти HttpUtility:

System.TypeLoadException was unhandled by user code
  Message=Could not load type 'System.Net.HttpUtility' from assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'.
  StackTrace:
   at FluentHttp.HttpHelper.UrlEncode(String s)
   at Facebook.FacebookUtils.GetUrl(IDictionary`2 domainMaps, String name, String path, IDictionary`2 parameters)
   at Facebook.FacebookClient.GetUrl(String name, String path, IDictionary`2 parameters)
   at Facebook.FacebookClient.BuildRootUrl(HttpMethod httpMethod, String path, IDictionary`2 parameters)
   at Facebook.FacebookClient.PrepareRequest(String path, IDictionary`2 parameters, HttpMethod httpMethod, Stream& input, IDictionary`2& mediaObjects)
   at Facebook.FacebookClient.ApiAsync(String path, IDictionary`2 parameters, HttpMethod httpMethod, Object userToken)
   at Facebook.FacebookClient.GetAsync(String path, IDictionary`2 parameters, Object userToken)
   at Facebook.FacebookClient.GetAsync(String path, IDictionary`2 parameters)
   at Facebook.FacebookClient.GetAsync(String path)
   at TicTacToe10.Page.Page_Loaded(Object sender, RoutedEventArgs e)
   at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
InnerException: 

Я подтвердил, что включил System.Windows.dll и System.Net.dll.В чем может быть проблема?Мне кажется, что мой код в точности похож на пример CSFacebookSilverlightApp.Я также подумал, что это может быть связано со мной, используя Silverlight 3 вместо 4, но я попробовал все комбинации 3 и 4 с Facebook.dll для sl3 и sl4.

1 Ответ

0 голосов
/ 31 августа 2011

Оказывается, в моем проекте Silverlight отсутствовал символ компиляции SILVERLIGHT (возможно, потому, что я изначально создал его в MonoDevelop). Это заставило Facebook SDK искать неправильное место для HttpUtility. Вот код из SDK Facebook, который указал мне на решение:

public static string UrlEncode(string s)
    {
#if WINDOWS_PHONE
        return System.Net.HttpUtility.UrlEncode(s);
#elif SILVERLIGHT
        return System.Windows.Browser.HttpUtility.UrlEncode(s);
#else
        return UrlEncode(s, Encoding.UTF8);
#endif
    }
...