title: YouTube API V3 Upload video throws exception
body: <p>I am working with Web application with C# where user will browse a video file and web application will upload to YouTube via YouTube API V3. I am getting the error. Please advice where i am doing wrong?</p>
  
  <p>Error: System.ArgumentNullException: Value cannot be null. Parameter name: baseUri at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task) at Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Microsoft.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult() at Google.Apis.Upload.ResumableUpload1.d__e.MoveNext() in c:\code\google.com\google-api-dotnet-client\default\Tools\Google.Apis.Release\bin\Debug\output\default\Src\GoogleApis\Apis[Media]\Upload\ResumableUpload.cs:line 459</p>
  
  <p>I followed the below points.</p>
  
  <ol>
  <li>Created ClientID for Webapplication and downloaded client_secrets.json file from API Access page.</li>
  <li>Used the .Net sample code provided in <a href="https://developers.google.com/youtube/v3/docs/videos/insert#examples" rel="nofollow">https://developers.google.com/youtube/v3/docs/videos/insert#examples</a> also referred same code from <a href="https://developers.google.com/youtube/v3/code_samples/dotnet" rel="nofollow">https://developers.google.com/youtube/v3/code_samples/dotnet</a></li>
  <li>My application got authorized to YouTube API.</li>
  <li>While uploading the video file, i am getting below error.</li>
  </ol>
  
  <p>I am pasting below my code for your reference.</p>
  
  <p>/* TestFileUploader.aspx */</p>
  
  <pre><code>&lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestFileUploader.aspx.cs" Inherits="TestFileUploader" Async="true" %&gt;
  
  &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
  &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
  &lt;head&gt;
  &lt;/head&gt;
  &lt;body&gt;
      &lt;form id="qaform" runat="server"&gt;
          &lt;div&gt;
              &lt;p&gt;
                  &lt;asp:FileUpload runat="server" ID="FileUpload1" onchange="AddEventChoosePicture(this,'FileUpload1')"
                      Style="width: 100%;" /&gt;
              &lt;/p&gt;
              &lt;p&gt;
                  &lt;asp:Button ID="submit" runat="server" OnClick="submit_Click" Text="Submit" /&gt;
              &lt;/p&gt;
          &lt;/div&gt;
      &lt;/form&gt;
  &lt;/body&gt;
  &lt;/html&gt;
  </code></pre>
  
  <p>/* TestFileUploader.aspx.cs */</p>
  
  <pre><code>using System;
  using System.Web;
  using System.IO;
  using QA.credential;
  
  using Google.Apis.Auth.OAuth2;
  using Google.Apis.YouTube.v3;
  using Google.Apis.Services;
  using Google.Apis.YouTube.v3.Data;
  using Google.Apis.Upload;
  
  public partial class TestFileUploader : System.Web.UI.Page
  {
      protected void Page_Load(object sender, EventArgs e)
      {
      }
  
      protected void submit_Click(object sender, EventArgs e)
      {
          try
          {
              if (FileUpload1.HasFile)
              {
                  String FileUpload1_Ext = System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
                  UploadVideos(FileUpload1.FileContent, FileUpload1.PostedFile.ContentType);
              }
          }
          catch (Exception ex)
          {
              Response.Write(ex.Message);
          }
  
      }
  
      private async void UploadVideos(Stream uploadedStream, String contenttype)
      {
          try
          {
              UserCredential credential;
              String clientsecretkeypath = HttpContext.Current.Server.MapPath("~/client_secrets.json");
              using (var stream = new FileStream(clientsecretkeypath, FileMode.Open, FileAccess.Read))
              {
                  credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                      GoogleClientSecrets.Load(stream).Secrets,
                      new[] { YouTubeService.Scope.YoutubeUpload },
                      "user", System.Threading.CancellationToken.None);
              }
  
              // Create the service.
              var youtubeService = new YouTubeService(new BaseClientService.Initializer()
              {
                  //ApiKey = "AIzaSyAFxuAA4r4pf6VX75zEwCrIh5z4QkzOZ6M",
                  HttpClientInitializer = credential,
                  ApplicationName = PhotoandVideoupload.applicationname
              });
  
              var video = new Video();
              video.Snippet = new VideoSnippet();
              video.Snippet.Title = "My Test Movie";
              video.Snippet.Description = "My description";
              video.Snippet.Tags = new string[] { "Autos" };
              video.Snippet.CategoryId = "2";
              video.Status = new VideoStatus();
              video.Status.PrivacyStatus = "unlisted";
  
              // Using snippet,status below throws 401(UnAuthorized issue).
              // Using snippet alone throws 404(Bad Request).
              //In both case, Null Exception throws for parameter baseURI.
              var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet", uploadedStream, contenttype);
              videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
              videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;
  
              Google.Apis.Upload.IUploadProgress progress = await videosInsertRequest.UploadAsync();
  
              switch (progress.Status)
              {
                  case UploadStatus.Uploading:
                      Response.Write(String.Format("{0} bytes sent.", progress.BytesSent));
                      break;
  
                  case UploadStatus.Failed:
                      Response.Write(String.Format("{0}&lt;br/&gt;", progress.Exception.Message));
                      Response.Write(String.Format("{0}&lt;br/&gt;", progress.Exception.StackTrace));
                      break;
              }
  
  
              // Also tried to read file from server path instead of uploading via fileupload control.
              /*
              using (var fileStream = new FileStream(HttpContext.Current.Server.MapPath("~/1.mp4"), FileMode.Open))
              {
                  var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, contenttype);
                  videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
                  videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;
  
                  await videosInsertRequest.UploadAsync();
              }
              */
  
          }
          catch (Exception ex)
          {
              Response.Write(ex.Message + " " + ex.StackTrace);
          }
          finally
          {
          }
      }
  
      void videosInsertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress)
      {
          switch (progress.Status)
          {
              case UploadStatus.Uploading:
                  Response.Write(String.Format("{0} bytes sent.", progress.BytesSent));
                  break;
  
              case UploadStatus.Failed:
                  Response.Write(String.Format("{0}&lt;br/&gt;", progress.Exception.Message));
                  Response.Write(String.Format("{0}&lt;br/&gt;", progress.Exception.StackTrace));
                  break;
          }
      }
  
      void videosInsertRequest_ResponseReceived(Video video)
      {
          Response.Write(String.Format("Video id '{0}' was successfully uploaded.", video.Id));
      }
  
  }
  </code></pre>
  
  <p>Please advice where i am doing wrong?</p>
  
  <p>Thanks,</p>