我试图用C#实现一个Web服务来从Google Analytics检索数据。当我在本地计算机上尝试它时,它可以工作,但是当我将其发布到服务器时,我有一个例外。我在Google Analytics控制台上创建了一个项目,并将生成的client_secret json下载了。我在应用程序的根路径上上传了 json,并将 client_secret.json 文件的"生成操作"设置为"内容",并将"复制到输出目录"设置为"如果较新"则为"复制"。这是我执行身份验证的代码:
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 或其他有效的身份验证凭据。
有人可以帮助我吗?谢谢
问题在于FileDataStore的访问权限。可能指定应用尝试在无权写入的位置创建和写入文件夹的相对路径。我更改了在不同位置的路径,我在变量路径文件数据存储中传递:
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 + "nn");
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:请求超时。
我想我解决了GoogleWebAuthorizationBroker.AuthorizeAsync的冻结问题,在此线程中由iedoc回答