Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Google OAuth方法AuthorizeAsync在从某些应用程序调用时挂起_C#_Google Drive Api_Google Oauth - Fatal编程技术网

C# Google OAuth方法AuthorizeAsync在从某些应用程序调用时挂起

C# Google OAuth方法AuthorizeAsync在从某些应用程序调用时挂起,c#,google-drive-api,google-oauth,C#,Google Drive Api,Google Oauth,我编写了一个C#库,它提供了一些帮助函数来访问Google驱动器 服务构造函数调用AuthorizeAsync,如下所示: // get access token var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, Scopes, key, CancellationToken.None, storageService).Result; 我已经为此编写了单元测试,这些测试在从单元测试系统运行时可以工作。我也曾

我编写了一个C#库,它提供了一些帮助函数来访问Google驱动器

服务构造函数调用
AuthorizeAsync
,如下所示:

// get access token
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, Scopes, key, CancellationToken.None, storageService).Result;
我已经为此编写了单元测试,这些测试在从单元测试系统运行时可以工作。我也曾在Windows服务中使用过它,而且它工作得很好。我知道这个代码是有效的

我现在尝试在一个有更多DLL和引用的旧应用程序中使用它,当我调用该方法时,它只是挂起,没有引发异常

我强烈怀疑这是某个地方的DLL冲突,但如果编译中没有异常或任何错误,就不可能知道要更改什么

API版本:

  <package id="Google.Apis" version="1.8.2" targetFramework="net45" />
  <package id="Google.Apis.Auth" version="1.8.2" targetFramework="net45" />
  <package id="Google.Apis.Core" version="1.8.2" targetFramework="net45" />
  <package id="Google.Apis.Drive.v2" version="1.8.1.1270" targetFramework="net45" />

相关图书馆:

  <package id="log4net" version="2.0.3" targetFramework="net45" />
  <package id="Microsoft.Bcl" version="1.1.9" targetFramework="net45" />
  <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" />
  <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net45" />
  <package id="Microsoft.Net.Http" version="2.2.22" targetFramework="net45" />


欢迎任何指针。

由于应用程序托管在IIS上,因此代码无法运行。IIS访问%appdata%文件夹内的文件夹时可能出现问题。默认情况下,令牌文件保存在%appdata%文件夹中。我试图更改对该文件夹的权限。我添加了所有人、DefaultAppPool、I_用户,。。。但是没有成功。还有更新版本的Google.api(1.8.2),它允许完整路径(新文件数据存储(fullPath,true))true意味着完整路径,但即使在那里也有bug。不可能使用该构造函数,因为我总是遇到错误。所以我决定我的应用程序应该使用IIS Express(事实上,我创建了一个新项目,里面有授权代码)。转到解决方案属性并设置应用程序使用IIS Express

从(选择web应用程序)获取cliendId(json文件),并为javascript源设置http://localhost:48372(或您的应用程序端口使用的任何端口),为重定向url设置http://localhost:48372/authorize.aspx。您还应该在internet上找到如何使端口静态)。保存你的clientId文件。(这一步您可能已经完成了) 在使用IIS express时,AuthorizeAsync方法应该没有问题。系统将提示您输入您的凭据并选择您的youtube帐户(如果您已经登录,则只需选择帐户)。当您授予应用权限时,您将被重定向到authorize.aspx。授权aspx页面应使用提供的客户端机密属性和数据存储属性创建新的IAuthorization流对象。使用code=Request.Params[“code”]从URL读取代码并创建UserCredential对象。YouTube服务的HttpClientInitializer属性的类型为UserCredential。您应该使用的方法类似于var usercredential=flow.SomeMethodWhichReceives(“user”、code、CancelletionToken.None)。之后,将在指定的FileDataStore文件夹中生成包含刷新令牌的文件。 当您拥有刷新令牌时,您可以做任何您想做的事情,因为刷新令牌应该永远持续(除非手动撤销)。有一种方法允许从refreshtoken获取usercredential,类似于flow.getAccessTokenfromRefreshToken(“用户”、“您的\u刷新\u令牌\u字符串”) 所以,当您拥有刷新令牌并使用methodlast方法时,您将能够访问GoogleYouTubeAPI。您还可能会有其他用户使用此aproach上传到您的youtube帐户。如果你对用户放在你帐户上的内容感兴趣,你可以随时将他们上传的视频制作成私人视频,并在验证后将其更改为公共视频

google youtube api中的一些方法需要OAUTH2身份验证(从客户端机密中获取刷新令牌->从刷新令牌中获取访问令牌…),例如上载视频,但一些类似getvideos的方法不需要OAUTH2身份验证。您可以向youtubeService构造函数提供API密钥,而不是UserCredential


编辑:还有一个我忘记提及的问题(对于那些认为这就是全部的人)。当您向应用程序授予访问google api的权限时(就在您被reddirected授权.aspx之前),您将得到错误重定向\u url不匹配,因为url参数中的某个位置重定向\u url与您在ClientId json中提供的重定向url不匹配(至少出于某种原因,端口不同)。更改此参数,使其与您在clientId json中提供的重定向url相匹配。

感谢您的全面输入!我应该补充一点,我没有将文件系统用于令牌,我有自己的IDataStore实现,它使用内存,所以文件访问不是问题。你可以在我的博客上读到更多信息,这可能会对你有所帮助。