【问题标题】:c# web service Google Analyticsc# 网络服务谷歌分析
【发布时间】:2017-10-10 15:27:58
【问题描述】:

我尝试用 C# 实现 Web 服务以从 Google Analytics 检索数据。 当我在本地计算机上尝试它时它可以工作,但是当我将它发布到服务器时出现异常。 我在 Google Analytics 控制台上创建了一个项目,并下载了生成的 client_secret json。 我在我的应用程序的根路径上上传了 json,并将 client_secret.json 文件上的 Build Action 设置为 Content 并将 Copy to Output Directory 设置为 Copy(如果更新)。 这是我执行身份验证的代码:

static async Task<UserCredential> GetCredential()
    {
        try
        {
            string jsonPath = HttpContext.Current.Server.MapPath("~/client_secret.json");

            HttpContext.Current.Response.Write(jsonPath);

            using (var stream = new FileStream(jsonPath, FileMode.Open, FileAccess.Read))
            {
                const string loginEmailAddress = "my@emailaddress.com";
                return await GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    new[] { AnalyticsReportingService.Scope.Analytics },
                    loginEmailAddress, System.Threading.CancellationToken.None,
                    new FileDataStore("GoogleAnalyticsApiWebService")
                    );
            }

        }
        catch (Exception ex)
        {

            HttpContext.Current.Response.Write("\n" + ex.Message);
            return null;
        }
    }

当我尝试在本地执行时,它可以正常工作,当我在服务器上发布并从 UTL 调用它时出现异常:

对路径“GoogleAnalyticsApiWebService”的访问被拒绝。Google.Apis.Requests.RequestError 请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。

有人可以帮助我吗?谢谢

【问题讨论】:

  • 某事让我相信问题出在这里:string jsonPath = HttpContext.Current.Server.MapPath("~/client_secret.json"); 你确定这是你的凭证 json 文件所在的正确路径吗?
  • 我觉得不是这个问题,我查了一下,路径是正确的

标签: c# json web-services google-analytics


【解决方案1】:

问题在于 FileDataStore 的访问权限。可能指定了应用程序试图在没有写入权限的位置创建和写入文件夹的相对路径。我在不同的位置更改了路径,我传入了变量 pathFileDataStore:

static async Task<UserCredential> GetCredential()
    {
        try
        {
            string jsonPath = System.Configuration.ConfigurationManager.AppSettings["VPJSON"].ToString() + "\\client_secret.json";

            HttpContext.Current.Response.Write("JSON PATH: " + jsonPath);

            using (var stream = new FileStream(jsonPath, FileMode.Open, FileAccess.Read))
            {
                const string loginEmailAddress = "marketing@easyconsulting.com";
                HttpContext.Current.Response.Write("\n EMAIL LOGIN: " + loginEmailAddress + "\n");

                GoogleClientSecrets clientSecrets = GoogleClientSecrets.Load(stream);
                HttpContext.Current.Response.Write("\n" + "CLIENT SECRET: " + clientSecrets.Secrets.ClientSecret + "\n");
                HttpContext.Current.Response.Write("\n" + "CLIENT ID: " + clientSecrets.Secrets.ClientId + "\n\n");

                string pathFileDataStore = "d:\\GADataStore";
                FileDataStore ds = new FileDataStore(pathFileDataStore,true);
                HttpContext.Current.Response.Write("\n" + "PATH FILE DATA STORE: " + ds.FolderPath + "\n");



                return await GoogleWebAuthorizationBroker.AuthorizeAsync(
                    clientSecrets.Secrets,
                    new[] { AnalyticsReportingService.Scope.Analytics },
                    loginEmailAddress, System.Threading.CancellationToken.None,
                    ds
                    );
            }

        }
        catch (Exception ex)
        {

            HttpContext.Current.Response.Write("\n" + "GetCredential() " + ex.Message);
            return null;
        }
    }

现在它创建了文件夹,但现在我遇到了不同的问题。它不会在文件夹中创建任何文件。当我调用我的 Web 服务的 Url 时,出现以下异常:System.Web.HttpException: 请求超时。

【讨论】:

    【解决方案2】:

    我想我解决了 GoogleWebAuthorizationBroker.AuthorizeAsync 以下 iedoc 在this thread 中的回答的冻结问题

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多