Маршрутизация запросов приложений Facebook в ASP.Net MVC 4

Мой мобильный веб-сайт позволяет пользователям отправлять AppRequest своим друзьям в Facebook. Это работает.

Когда друг принимает AppRequest, Facebook отправляет друга на мой веб-сайт. Это тоже работает.

Мой веб-сайт представляет собой приложение ASP.Net MVC 4. Я пытаюсь заставить свои маршруты распознавать входящее принятие AppRequest, но я не могу понять, как это сделать.

Facebook отправляет друзей на мой сайт, используя этот URL:

http://www.example.com/?ref=notif&code=abcdefg&fb_source=notification

Это продолжает направляться в Home/Index, несмотря на мои попытки сопоставить маршрут с пользовательским контроллером и действием. Вот что я сделал до сих пор, что не сработало:

Зарегистрированные маршруты:

routes.MapRoute(
   name: "FacebookAppRequest",
   url: "{ref}/{code}/{fb_source}",   //This should match the URL above
   defaults: new { controller = "Facebook", action ="FBAppRequestHandler"}
);
routes.MapRoute(
   name: "Default",
   url: "{controller}/{action}/{id}",
   defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Контроллер:

public class FacebookController : Controller
{
   public FacebookController() {}

   public ActionResult FBAppRequestHandler(
      [Bind(Prefix = "ref")] string fbReferal,
      [Bind(Prefix = "code")] string fbCode,
      [Bind(Prefix = "fb_source")] string fbSource)
   {
      //Do some stuff with fbReferal, fbCode and fbSource

      return View();
   }

person Stoop    schedule 14.01.2013    source источник


Ответы (1)


ref, code и fb_source передаются как параметры строки запроса. Они не являются частью маршрута. Таким образом, вы не можете ожидать, что {ref}/{code}/{fb_source} будет соответствовать вашему пользовательскому маршруту. Это было бы так, если бы запрос выглядел так:

http://www.example.com/notif/abcdefg/notification

Поскольку реальный маршрут выглядит так (забудьте о параметрах строки запроса — они не используются для маршрутизации):

http://www.example.com/

все, что у вас есть здесь, в основном, это следующий URL-адрес /. Поэтому лучшее, на что вы можете здесь надеяться, это изменить маршрут по умолчанию, чтобы он направлялся к нужному контроллеру:

routes.MapRoute(
   name: "Default",
   url: "{controller}/{action}/{id}",
   defaults: new { controller = "Facebook", action = "FBAppRequestHandler", id = UrlParameter.Optional }
);

Теперь избавьтесь от первого маршрута - он не нужен.

person Darin Dimitrov    schedule 14.01.2013