1

我想在asp.net web api项目中使用gmail api。这是我到目前为止有:使用与asp.net web api的gmail api

 UserCredential credential; 
     var cleantSecretPath = HostingEnvironment.MapPath("~/client_secret.json"); 
     var rootPath = HostingEnvironment.MapPath("~/"); 

     if (rootPath != null) 
     { 
      var credentialPath = Path.Combine(rootPath, "Credentials"); 
      var directoryInfo = Directory.CreateDirectory(credentialPath); 
     } 

     var credentialsPath = HostingEnvironment.MapPath("~/Credentials/"); 

     using (var stream = new FileStream(cleantSecretPath, FileMode.Open, FileAccess.Read)) 
     { 
      var secret = GoogleClientSecrets.Load(stream).Secrets; 
      var dataStore = new FileDataStore("test"); 
      credential = GoogleWebAuthorizationBroker.AuthorizeAsync(secret, Scopes, _credentials.Email, CancellationToken.None, dataStore).Result; 
     } 

     var service = new GmailService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = ApplicationName, 
     }); 
     return 

它工作本地主机上,但只要我将其部署到Azure我收到一个错误:

<Error> 
    <Message>An error has occurred.</Message> 
    <ExceptionMessage>One or more errors occurred.</ExceptionMessage> 
    <ExceptionType>System.AggregateException</ExceptionType> 
    <StackTrace> 
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task`1.get_Result() at BL.GmailServiceBl.GetGmailService() in D:\Development\DotNetProjects\GmailAnalysis\BL\GmailServiceBl.cs:line 53 at BL.AnalysisService..ctor(PersonCredentials credentials) in D:\Development\DotNetProjects\GmailAnalysis\BL\AnalysisService.cs:line 22 at WebAPI.Controllers.ValuesController.Get(PersonCredentials credentials) in D:\Development\DotNetProjects\GmailAnalysis\WebAPI\Controllers\ValuesController.cs:line 63 at lambda_method(Closure , Object , Object[]) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.AuthenticationFilterResult.<ExecuteAsync>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext() 
    </StackTrace> 
    <InnerException> 
     <Message>An error has occurred.</Message> 
     <ExceptionMessage>Access is denied</ExceptionMessage> 
     <ExceptionType>System.Net.HttpListenerException</ExceptionType> 
     <StackTrace> 
     at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task) at Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.<AuthorizeAsync>d__1.MoveNext() in c:\code\github\google-api-dotnet-client\Tools\Google.Apis.Release\bin\Release\1.9.2\default\Src\GoogleApis.Auth.DotNet4\OAuth2\GoogleWebAuthorizationBroker.cs:line 59 
     </StackTrace> 
    </InnerException> 
</Error> 

我使用client_secret.json为Web应用。有人能给我一个例子,或者指出我正确的方向。

+0

什么是您实际存储json的地方的物理路径? – viperguynaz

+0

这是Azure的HostingEnvironment.MapPath(“〜/ client_secret.json”)上的WebApi项目的一个根,因为我在调试器中看到client_secret.json不是问题 –

+0

尝试新的FileDataStore(“。”,true);如果@DimaDaron说不起作用。 – DaImTo

回答

0

这里有一个工作的例子:

var filePath = HostingEnvironment.MapPath("~/build-info.json"); 
var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
string fileContent; 
using (var reader = new StreamReader(fileStream)) 
{ 
    fileContent = reader.ReadToEnd(); 
} 

我已经在本地运行这个并将其部署到蔚蓝的Web应用程序,它在两个位置工作。

所以像下面应该工作:

UserCredential credential; 
var filePath = HostingEnvironment.MapPath("~/client_secret.json"); 
using (var stream = new FileStream(filePath , FileMode.Open, FileAccess.Read)) 
{ 
    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, 
     new[] { GmailService.Scope.GmailReadonly }, 
     "user", CancellationToken.None); 
} 
+0

嗨@viperguynaz谢谢你的帮助,但是如果你使用await,那么凭证不会返回,如果你要更改这样的代码:'credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, new [] {GmailService.Scope.GmailReadonly} , “user”,CancellationToken.None).Result;'你会得到访问被拒绝错误 –

0

几天后解决类似的问题,我发现,这不是你应该怎么做:

credential = GoogleWebAuthorizationBroker.AuthorizeAsync(secret, Scopes, _credentials.Email, CancellationToken.None, dataStore).Result; 

相反,应使用FlowMetadata方法进行身份验证,demonstrated here.