2017-07-21 62 views
1

Googleのディスクからファイルをダウンロードしようとしています。 認証クラス:その後GoogleドライブAPIプロキシの例外407

internal static class Perm_AppData 
{ 
    private static string[] scopes = { DriveService.Scope.DriveFile }; 
    private static DriveService service = Autorization(); 
    internal static DriveService Service { get { return service; } } 

    private static DriveService Autorization() 
    { 
     UserCredential credential; 

     using (var stream = GetCliSecStream()) 
     { 
      credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
       GoogleClientSecrets.Load(stream).Secrets, 
       scopes, 
       "user", 
       CancellationToken.None, 
       new FileDataStore(auth, true)).Result; 
     } 

     return new DriveService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = applicationName 
     }); 
    } 

    private static Stream GetCliSecStream() 
    { 
     var stream = new MemoryStream(); 
     var writer = new StreamWriter(stream); 
     writer.Write(uSec); 
     writer.Flush(); 
     stream.Position = 0; 
     return stream; 
    } 
} 

は、私がアカウントを選択し、アプリケーションの権利を確認しました。次のファイルをダウンロード

internal static MemoryStream DownloadFile(string fileId = null, string fileName = null) 
{ 
    using (new Watcher($"Download {fileName} {fileId}")) 
    { 
     GetRequest request = null; 
     if (fileId != null) 
     { 
      request = service.Files.Get(fileId); 
     } 
     else 
     { 
      if (fileName != null) 
      { 
       request = service.Files.Get(ViewDrive(SearchParameter.name, new string[] { fileName }).First().Id); 
      } 
      else 
      { 
       throw new Exception("You need at least one not null parameter to download"); 
      } 
     } 

     request.Fields = "id, name"; 
     var fileMemoryStream = new MemoryStream(); 
     request.Download(fileMemoryStream); 
     return fileMemoryStream; 
    } 
} 

にファイルをダウンロードするための要求が例外をスローしている(System.Net.WebException:リモートサーバーがエラーを返しました:(407)プロキシ認証が必要):

Error: System.TypeInitializationException: Инициализатор типа "Updater.UnDloadAP I" выдал исключение. ---> System.TypeInitializationException: Инициализатор типа "Updater.Perm_AppData" выдал исключение. ---> System.AggregateException: Произо шла одна или несколько ошибок. ---> System.Net.Http.HttpRequestException: Произо шла ошибка при отправке запроса. ---> System.Net.WebException: Удаленный сервер возвратил ошибку: (407) Требуется аутентификация посредника. в System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, Tra nsportContext& context) в System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)

--- Конец трассировки внутреннего стека исключений --- в Google.Apis.Http.ConfigurableMessageHandler.d__55.MoveNext() --- Конец трассировка стека из предыдущего расположения, где возникло исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti fication(Task task) в Google.Apis.Auth.OAuth2.Requests.TokenRequestExtenstions.d__0 .MoveNext() --- Конец трассировка стека из предыдущего расположения, где возникло исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti fication(Task task) в Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.d__35. MoveNext() --- Конец трассировка стека из предыдущего расположения, где возникло исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti fication(Task task) в Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.d__30.MoveNext() --- Конец трассировка стека из предыдущего расположения, где возникло исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti fication(Task task) в Google.Apis.Auth.OAuth2.AuthorizationCodeInstalledApp.d__8. MoveNext() --- Конец трассировка стека из предыдущего расположения, где возникло исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti fication(Task task) в Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.d__4.M oveNext() --- Конец трассировка стека из предыдущего расположения, где возникло исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti fication(Task task) в Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.d__1.M oveNext() --- Конец трассировки внутреннего стека исключений ---
в System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledE xceptions) в System.Threading.Tasks.Task 1.GetResultCore(Boolean waitCompletionNotificat ion) в System.Threading.Tasks.Task 1.get_Result() в Updater.Perm_AppData.Autorization() в C:\Users\User\Documents\Visual Studio Projects\SMNote\Updater\Classes\API\Perm_AppData.cs:строка 27

:私はプロキシ
ポスト更新1位なしでインターネットに接続する場合、私はエラーを取得しない

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials; 

:私のようなものが必要
次のコードは通常:次のコードは、通常、私はあなたが

ポスト更新#2を駆動何とか手動でのGoogleの要求にプロキシを追加する必要があることを信じて、

var request = (HttpWebRequest)WebRequest.Create(link); 
request.Credentials = CredentialCache.DefaultCredentials; 
request.Proxy.Credentials = CredentialCache.DefaultCredentials; 

したがって、プロキシを通過しますプロキシを通過する

internal static void DoIt() 
{ 
    try 
    { 
     var t = DownloadPageAsync(); 
     Console.WriteLine("Downloading page..."); 
     Console.WriteLine(t.Result); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
    } 
} 

private static async Task<string> DownloadPageAsync() 
{ 
    var proxy = WebRequest.DefaultWebProxy; 
    proxy.Credentials = CredentialCache.DefaultCredentials; 
    var httpClientHandler = new HttpClientHandler() 
    { 
     Proxy = proxy 
    }; 
    using (HttpClient client = new HttpClient(httpClientHandler)) 
    { 
     using (HttpResponseMessage response = await client.GetAsync("https://mail.ru")) 
     { 
      using (HttpContent content = response.Content) 
      { 
       string result = await content.ReadAsStringAsync(); 
       return result.Substring(0, 50); 
      } 
     } 
    } 
} 
+0

"私は何かが必要です" - そうするとどうなりますか? * 'WebRequest.DefaultWebProxy'がデフォルトで使用されると期待しています。 –

+0

更新された更新#1 –

+0

'WebRequest.DefaultWebProxy'とその資格情報を設定しても何が起こるのかまだまだありません。これは私のコードが 'HttpClientHandler'を介して暗黙的に使用することを期待しているものです –

答えて

0

Googleドライブのコードは問題なく動作します。問題は、私はプロキシへのアクセスが制限されていることです。問題を見つけるのを助けたジョンSkeetに感謝します

関連する問題