asp.net-mvc-3 - 在 Azure 网站上使用 GData API 时出现 InvalidCredentialsException;本地调试运行正常

标签 asp.net-mvc-3 asp.net-mvc-4 azure google-api gdata

我有一个 MVC4 应用程序正在尝试使用 C# GData API ( https://developers.google.com/gdata/client-cs ) 访问 Google 文档。

当我从 Visual Studio 以 Debug模式在本地运行该网站时,该应用程序按预期工作,但当我在 Azure 网站上发布和运行时,该应用程序始终失败并出现 InvalidCredentialsException。

我创建了一个最小的 MVC4 应用程序来重现此行为。它部署到一个 azure 的网站,除了帮助我调试这个问题之外,没有做任何事情。我将失败操作的本质塞进 About() Controller 只是为了获得重现 - 这不是我的实际项目的设置方式。另请注意,当我去年一月第一次编写该网站时,这是有效的。我不知道在此期间发生了什么变化使其停止工作。我确实知道我可以在 MVC3 或 MVC4 中重现此问题。

About() Controller 当前为:

  public ActionResult About()
    {
 string username = "<omitted>";
 string password = "<omitted>";
 string appname = "<omitted>";

 var count = 0;            

 var query = new SpreadsheetQuery();
 var gDocsService = new DocumentsService(appname);
 var gDocsRequestSettings = new RequestSettings(appname, username, password);
 var gDocsRequest = new DocumentsRequest(gDocsRequestSettings);
 var feed = gDocsRequest.GetSpreadsheets();
 foreach (Document entry in feed.Entries)
 {
     count++;
 }
 ViewBag.Message = count.ToString();
 return View();}

SpreadsheetQuery、DocumentsService、RequestSettings 和 DocumentsRequest 都是 GData 库提供的类。

期望>> 计数应该显示在显示消息的“关于” View 中。 实际>>这在本地调试中按预期工作,因此我知道凭据实际上是有效的,但是当我发布到azure时,我遇到了以下异常/堆栈跟踪:

[InvalidCredentialsException: Invalid credentials]
   Google.GData.Client.Utilities.QueryClientLoginToken(GDataCredentials gc, String serviceName, String applicationName, Boolean fUseKeepAlive, IWebProxy proxyServer, Uri clientLoginHandler) +886
   Google.GData.Client.GDataGAuthRequest.QueryAuthToken(GDataCredentials gc) +263
   Google.GData.Client.GDataGAuthRequest.EnsureCredentials() +40
   Google.GData.Client.GDataRequest.EnsureWebRequest() +1147
   Google.GData.Client.GDataGAuthRequest.EnsureWebRequest() +26
   Google.GData.Client.GDataRequest.Execute() +37
   Google.GData.Client.GDataGAuthRequest.Execute(Int32 retryCounter) +484
   Google.GData.Client.GDataGAuthRequest.Execute() +10
   Google.GData.Client.Service.Query(Uri queryUri, DateTime ifModifiedSince, String etag, Int64& contentLength) +190
   Google.GData.Client.Service.Query(FeedQuery feedQuery) +177
   Google.GData.Client.Feed`1.get_AtomFeed() +35
   Google.GData.Client.<get_Entries>d__0.MoveNext() +69
   Mvc4ApplicationPublishTest.Controllers.HomeController.About() +287
   lambda_method(Closure , ControllerBase , Object[] ) +62
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +182
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +99
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9631764
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

还有一个注释,以防可能相关:最近我第一次尝试从 azure 运行该应用程序时,谷歌向我发送了一封电子邮件,称该应用程序由于请求的可疑性质而被阻止。当我第一次开发该网站时,它从未这样做过。我(通过他们的 UI)表明该应用程序是合法的,但它可能仍然不信任 azure,并且以某种方式阻止登录...我不知道如何证明/反驳这个理论,或者如何解决它如果是这样的话。

只是为了确保它 100% 清楚:使用相同的凭据在本地/调试中操作确实成功,所以我知道我使用的是正确的凭据,并且逻辑原则上有效。

任何关于在这里寻找/尝试什么的指导将不胜感激!

最佳答案

我可能是由于2路身份验证,你是否偶然启用了它? 如果是这样,您必须确保使用应用程序专用密码而不是个人密码。 有关如何设置应用程序密码的更多信息,请参见此处: https://support.google.com/accounts/answer/185833?hl=en

关于asp.net-mvc-3 - 在 Azure 网站上使用 GData API 时出现 InvalidCredentialsException;本地调试运行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856995/

相关文章:

c# - ASP.NET MVC3 中表单的 ReturnUrl

c# - 如何将动态变量传递给 asp.net mvc 中的授权属性类?

c#-4.0 - 如何在 ASP.Net MVC 中使用 PdfSharp 显示 PDF?

php - 从 Azure Blob 存储下载 PHP 中的大文件

c# - mvc3 验证检查属性值是否不同

c# - 新 MVC3 项目中的 InversionOfControl

Azure 数据工厂和 GraphDb

Azure - az aks cli azure 广告错误

c# - 如何使用 Html Agility Pack 使请求超时

asp.net-mvc-4 - 基于角色的导航