Asp.net mvc Umbraco异步SurfaceControl控制器

Asp.net mvc Umbraco异步SurfaceControl控制器,asp.net-mvc,async-await,umbraco7,surface-controller,Asp.net Mvc,Async Await,Umbraco7,Surface Controller,我正在一个项目(ASP.NET MVC 5)上工作,我正在使用Umbraco 7.4.3。我正在尝试与oauth2一起实现google analytics api。我使用了谷歌文档平台上提供的示例代码。在使用我的google帐户进行授权后,我获得了一个正确的刷新令牌。但问题是这个刷新令牌在URL中返回,并且没有被我的控制器传递到仍然为空的视图。我有一种感觉,我的控制器不会等到用户授权他或她的谷歌帐户后才执行它的代码,因此控制器不会担心等待操作员 公共类GoogleAnalyticControl

我正在一个项目(ASP.NET MVC 5)上工作,我正在使用Umbraco 7.4.3。我正在尝试与oauth2一起实现google analytics api。我使用了谷歌文档平台上提供的示例代码。在使用我的google帐户进行授权后,我获得了一个正确的刷新令牌。但问题是这个刷新令牌在URL中返回,并且没有被我的控制器传递到仍然为空的视图。我有一种感觉,我的控制器不会等到用户授权他或她的谷歌帐户后才执行它的代码,因此控制器不会担心等待操作员

公共类GoogleAnalyticController:SurfaceControl
{
公共异步任务添加(CancellationToken CancellationToken)
{
var result=wait new AuthorizationCodeMvcApp(这是新的AppFlowMetadata()).authorizationAsync(cancellationToken);
如果(result.Credential!=null)
{
var服务=新分析服务(新BaseClientService.Initializer
{
HttpClientInitializer=result.Credential,
ApplicationName=“分析仪表板”
});
//你的代码应该在这里。。
ViewBag.AccessToken=result.Credential.Token.AccessToken;
ViewBag.RefreshToken=result.Credential.Token.RefreshToken;
var list=wait service.Management.AccountSummaries.list().ExecuteAsync(cancellationToken);
ViewBag.Username=list.Username;
对于(int i=0;i
PS:我已经在一个ASP.NET MVC 5项目中试用了这个示例代码,但没有安装Umbraco,它运行得非常好


有人能把我推向正确的方向吗?

对于其他遇到这个问题的人来说,解决方法其实很简单:


我为AuthCallbackController(/authcallback/indexasync)创建了自定义路由这一切都起到了作用。由于Umbraco接管了默认路由,因此无法访问此URL,因此未执行authcallbackcontroller的操作。

控制器操作的URL是什么?当您在操作中放置断点时,它是否被命中?/Umbraco/surface/googleanalytics/add。当我放置断点时,它确实被命中,但结果是t始终为空。调试时,传递给操作的取消令牌是否具有您期望的值?是的。我很确定问题是由等待运算符造成的。因为身份验证没有问题。问题是代码没有等待用户的响应。。
public class GoogleAnalyticsController : SurfaceController
{
    public async Task<ActionResult> Add(CancellationToken cancellationToken) 
    {
        var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).AuthorizeAsync(cancellationToken);

        if (result.Credential != null)
        {
            var service = new AnalyticsService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = result.Credential,
                    ApplicationName = "Analytics Dashboard"
                });

            // YOUR CODE SHOULD BE HERE..
            ViewBag.AccessToken = result.Credential.Token.AccessToken;
            ViewBag.RefreshToken = result.Credential.Token.RefreshToken;

            var list = await service.Management.AccountSummaries.List().ExecuteAsync(cancellationToken);
            ViewBag.Username = list.Username;

            for (int i = 0; i < list.TotalResults; i++)
            {
                ViewBag.WebsiteNames += list.Items[i].Name + "(" + list.Items[i].WebProperties[0].WebsiteUrl + ")";
            }

            return View("~/Views/Configboard.cshtml");
        }
        else
        {
            return new RedirectResult(result.RedirectUri);
        }
    }