使用C#.NET中的服务帐户检索Google Analytics数据时出现无效的响应错误

Ten*_*ies 5 c# web-services google-analytics-api google-oauth service-accounts

我正在尝试使用谷歌服务帐户编写一个在线应用程序来访问我的谷歌分析数据.这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace GA_server2server_POC.Models
{
    using System.Security.Cryptography.X509Certificates;
    using Google.Apis.Analytics.v3;
    using Google.Apis.Analytics.v3.Data;
    using Google.Apis.Authentication.OAuth2;
    using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
    using Google.Apis.Util;
    using Google.Apis.Services;
    using Google.Apis.Requests;

    public class Oauth_With_API
    {
        public static void ApiTest()
        {
            log4net.Config.XmlConfigurator.Configure();
            const string ServiceAccountId = "xxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com";
            const string ServiceAccountUser = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdeveloper.gserviceaccount.com";
            AssertionFlowClient client = new AssertionFlowClient(
                GoogleAuthenticationServer.Description, new X509Certificate2("C:\\Users\\rcarter\\Downloads\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-privatekey.p12", "notasecret", X509KeyStorageFlags.Exportable))
            {
                Scope = "https://www.googleapis.com/auth/analytics.readonly",
                ServiceAccountId = ServiceAccountUser
            };



            OAuth2Authenticator<AssertionFlowClient> authenticator = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState);

            AnalyticsService service = new AnalyticsService(new BaseClientService.Initializer()
            {
                Authenticator = authenticator
            });

            string profileId = "ga:xxxxxxxx";
            string startDate = "2013-07-01";
            string endDate = "2013-07-15";
            string metrics = "ga:visits";
            DataResource.GaResource.GetRequest request = service.Data.Ga.Get(profileId, startDate, endDate, metrics);
            request.Dimensions = "ga:date";
            GaData data = request.Execute(); //error occurs here. After this, thread exits.

            Console.WriteLine(data.TotalResults);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我的代码执行,但我得到以下输出:

WebDev.WebServer40.exe Information: 0 : DotNetOpenAuth, Version=4.0.0.11165, Culture=neutral, PublicKeyToken=2780ccd10d57b246 (official)
WebDev.WebServer40.exe Information: 0 : Preparing to send AssertionFlowMessage (2.0) message.
WebDev.WebServer40.exe Information: 0 : Sending AssertionFlowMessage request.
WebDev.WebServer40.exe Information: 0 : HTTP POST https://accounts.google.com/o/oauth2/token
WebDev.WebServer40.exe Information: 0 : The following required parameters were missing from the DotNetOpenAuth.OAuth2.Messages.AccessTokenFailedResponse message: {error,
}
WebDev.WebServer40.exe Information: 0 : Received UnauthorizedResponse response.
Run Code Online (Sandbox Code Playgroud)

在此之后,线程退出,程序拒绝打印任何数据.麻烦似乎发生在request.Execute();.我发现特别令人困惑的部分是,如果我打开一个断点Console.WriteLine(data.TotalResults);,我可以在局部变量中看到我想要的数据data.它包含了我想要打印的所有内容,但我无法确定错误的原因,使其无法执行任何操作request.Execute();.经过多次搜索,我没有发现上面列出的错误.

我正在使用的代码是基于给出这个问题的答案在这里.自从该问题得到解答后,谷歌分析库中的一些事情发生了变化,但我的大部分代码都是相同的.

我检查并重新检查了所有特定于帐户的变量.为了测试这个,我在我的本地机器上运行它作为ASP.NET MVC 4 Web App.

如何解决此问题的任何帮助或建议表示赞赏.如果我能提供更多可能有用的信息,请告诉我.谢谢阅读.

Kam*_*hid 0

尝试以下一项

using System.Security.Cryptography.X509Certificates;
using DotNetOpenAuth.OAuth2;
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using Google.Apis.Services;


        private void TestMethod()
        {
            try
            {
                string scope_url = "https://www.googleapis.com/auth/analytics.readonly";

                //client_id: This is the "Email Address" one, not the "Client ID" one... oddly...
                string client_id = "************-***********************@developer.gserviceaccount.com";

                //key_file: This is the physical path to the key file you downloaded when you created your Service Account
                string key_file = @"***************************************-privatekey.p12";

                //key_pass: This is probably the password for all key files, but if you're given a different one, use that.
                string key_pass = "notasecret";


                AuthorizationServerDescription desc = GoogleAuthenticationServer.Description;

                //key: Load up and decrypt the key
                X509Certificate2 key = new X509Certificate2(key_file, key_pass, X509KeyStorageFlags.Exportable);

                //client: we're using the AssertionFlowClient, because we're logging in with our certificate
                AssertionFlowClient client = new AssertionFlowClient(desc, key) { ServiceAccountId = client_id, Scope = scope_url };
                OAuth2Authenticator<AssertionFlowClient> auth = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState);

                //gas: An instance of the AnalyticsService we can query
                // AnalyticsService gas = null;// new AnalyticsService(auth);

                var gas = new AnalyticsService(new BaseClientService.Initializer()
                {
                    Authenticator = auth
                });
                //r: Creating our query
                DataResource.GaResource.GetRequest r = gas.Data.Ga.Get("ga:*******", "2012-09-26", "2012-10-10", "ga:visitors");

                //d: Execute and fetch the results of our query
                GaData d = r.Fetch();
            }
            catch (Exception ex)
            {

                throw;
            }
        }
Run Code Online (Sandbox Code Playgroud)