Google Drive API代理异常407

时间:2017-07-21 06:48:23

标签: c# google-api

我试图从谷歌磁盘下载文件。 Auth课程:

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)需要代理身份验证):

  

错误: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&上下文)   System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult的   AR)

     

---Конецтрассировкивнутреннегостекаисключений---в   Google.Apis.Http.ConfigurableMessageHandler.d__55.MoveNext()   ---Конецтрассировкастекаизпредыдущегорасположения,гдевозниклоисключение---в   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti   fication(任务任务)   Google.Apis.Auth.OAuth2.Requests.TokenRequestExtenstions.d__0   .MoveNext()   ---Конецтрассировкастекаизпредыдущегорасположения,гдевозниклоисключение---в   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti   fication(任务任务)   Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.d__35。   的MoveNext()   ---Конецтрассировкастекаизпредыдущегорасположения,гдевозниклоисключение---в   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti   fication(任务任务)   Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.d__30.MoveNext()   ---Конецтрассировкастекаизпредыдущегорасположения,гдевозниклоисключение---в   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti   fication(任务任务)   Google.Apis.Auth.OAuth2.AuthorizationCodeInstalledApp.d__8。   的MoveNext()   ---Конецтрассировкастекаизпредыдущегорасположения,гдевозниклоисключение---в   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti   fication(任务任务)   Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.d__4.M   oveNext()   ---Конецтрассировкастекаизпредыдущегорасположения,гдевозниклоисключение---в   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNoti   fication(任务任务)   Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.d__1.M   oveNext()---Конецтрассировкивнутреннегостекаисключений---
  System.Shreading.Tasks.Task.ThrowIfExceptional(布尔值   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

我需要类似的东西:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

如果我在没有代理的情况下连接到互联网,我不会收到错误 发布更新#1: 以下代码通常通过代理

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

因此,我认为您需要以某种方式手动添加代理到谷歌驱动器的请求

发布更新#2:
以下代码通常通过代理

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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

Google云端硬盘代码正常运行。问题是我对Proxy的访问权限有限。感谢Jon Skeet帮助找到问题