YouTube Data API v3 在生产服务器上部署时不起作用 [关闭]

Posted

技术标签:

【中文标题】YouTube Data API v3 在生产服务器上部署时不起作用 [关闭]【英文标题】:YouTube Data API v3 doesn't work when deployed on production server [closed] 【发布时间】:2017-02-19 05:27:32 【问题描述】:

我想创建一个 Stream 并进行直播。该代码在本地主机上运行良好,但部署时出现问题。它甚至不请求对 Google 帐户进行授权。看起来它甚至没有与之交互。

“/123456”应用程序中的服务器错误。

访问路径“YouTubeDataAPISample.YouTube.Auth.Store”是 拒绝。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.UnauthorizedAccessException:访问 路径“YouTubeDataAPISample.YouTube.Auth.Store”被拒绝。

ASP.NET 无权访问请求的资源。考虑 向 ASP.NET 请求授予对资源的访问权限 身份。 ASP.NET 有一个基本进程标识(通常 IIS 5 上的 MACHINE\ASPNET 或 IIS 6 和 IIS 7 上的网络服务,以及 IIS 7.5 上配置的应用程序池标识),如果 该应用程序不是模拟的。如果应用程序是 冒充 via ,身份将是 匿名用户(通常是 IUSR_MACHINENAME)或经过身份验证的用户 请求用户。

要授予 ASP.NET 对文件的访问权限,请右键单击文件中的文件 资源管理器,选择“属性”并选择“安全”选项卡。点击“添加” 添加适当的用户或组。突出显示 ASP.NET 帐户, 并选中所需访问权限的复选框。

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[UnauthorizedAccessException: 访问路径 “YouTubeDataAPISample.YouTube.Auth.Store”被拒绝。] System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +217 System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost) +11130032 System.IO.Directory.InternalCreateDirectoryHelper(字符串路径,布尔值 checkHost) +136 System.IO.Directory.CreateDirectory(字符串路径) +33 Google.Apis.Util.Store.FileDataStore..ctor(字符串文件夹,布尔全路径)+72 Template.BusinessLogic.Implementation.YouTubeAPI.AuthenticateOauth(字符串 clientId, String clientSecret, String userName, String apiKey) +220 Template.BusinessLogic.Implementation.YouTubeAPI..ctor() +63 Template.MVC5.Controllers.VideosController..ctor() +25

[TargetInvocationException: 异常已被目标抛出 调用。] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(布尔 publicOnly,布尔 skipCheckThis、布尔填充缓存、StackCrawlMark 和 stackMark)+113 System.RuntimeType.CreateInstanceDefaultCtor(布尔 publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232 System.Activator.CreateInstance(类型类型,布尔非公共)+83 System.Activator.CreateInstance(类型类型)+66 System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +55

[InvalidOperationException: 尝试创建一个错误 'Template.MVC5.Controllers.VideosController' 类型的控制器。制作 确保控制器具有无参数的公共构造函数。] System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext,类型控制器类型)+178 System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,类型控制器类型)+77 System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,字符串控制器名称)+88 System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext、IController&控制器、IControllerFactory&工厂) +191 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback 回调, 对象状态) +50 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback 回调,对象状态)+48 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext 上下文,AsyncCallback cb,对象 extraData)+16 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

授权码

private static YouTubeService AuthenticateOauth(string clientId, string clientSecret, string userName, string apiKey)
        
            string[] scopes = new string[]  YouTubeService.Scope.Youtube,  // view and manage your YouTube account
                                             YouTubeService.Scope.YoutubeForceSsl,
                                             YouTubeService.Scope.Youtubepartner,
                                             YouTubeService.Scope.YoutubepartnerChannelAudit,
                                             YouTubeService.Scope.YoutubeReadonly,
                                             YouTubeService.Scope.YoutubeUpload;


            // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData%
            UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets  ClientId = clientId, ClientSecret = clientSecret 
                                                                                         , scopes
                                                                                         , userName
                                                                                         , CancellationToken.None
                                                                                         , new FileDataStore("YouTubeDataAPISample.YouTube.Auth.Store")).Result;

            YouTubeService service = new YouTubeService(new YouTubeService.Initializer()
            
                ApiKey = apiKey,
                HttpClientInitializer = credential,
                ApplicationName = "YouTubeDataAPISample"
            );

            return service;           
        

检索视频的代码

        public PlaylistItemListResponse Videos()
    
        var playlistItemsListRequest = service.PlaylistItems.List("snippet");

        var channelsListRequest = service.Channels.List("contentDetails");
        channelsListRequest.Mine = true;
        foreach (var find in channelsListRequest.Execute().Items)
        
            var uploadsListId = find.ContentDetails.RelatedPlaylists.Uploads;

            var nextPageToken = "";
            while (nextPageToken != null)
            

                playlistItemsListRequest.PlaylistId = uploadsListId;
                playlistItemsListRequest.MaxResults = 50;
                playlistItemsListRequest.PageToken = nextPageToken;

                // Retrieve the list of videos uploaded to the authenticated user's channel.
                var playlistItemsListResponse = playlistItemsListRequest.Execute();

                nextPageToken = playlistItemsListResponse.NextPageToken;
            
        
        return playlistItemsListRequest.Execute();
    

【问题讨论】:

您是否尝试按照错误页面上的说明进行操作?它准确地告诉您需要做什么才能看到根本问题。 你能告诉我们你的代码吗?如果我们看不到您正在尝试做的事情,我们实际上无法解决问题。 但请记住,它在本地主机上工作,但在部署时却不行。 @mason 现在检查问题。 您仍然没有包含错误消息的详细信息。按照黄色屏幕上的说明进行操作 - 它会向您展示如何获取这些错误详细信息。包含没有实际错误详细信息的代码不太可能有用。 【参考方案1】:

要找到错误,您必须做以下三件事之一:

    登录服务器并点击“localhost”以查看详细的错误信息。 编写一些自定义代码将日志输出到某个位置,以便您阅读它们。 按照错误消息中的建议禁用customErrors这是个坏主意,但这是您的决定。 它应该设置为remoteonly

【讨论】:

我们已经尝试了您的所有解决方案。对于 1. 它适用于 localhost 但不适用于已部署的解决方案。对于 2. 它不执行 try 和 catch 块。对于 3. 它表示引用的对象未设置为对象的实例。 所以在这些 try/catch 块之外添加日志记录。听起来它会在此之外抛出错误,对吧? @XolaniChristopher 你在写InnerExeption 这没有用,而且概率null 无论如何。你想要ex.Message @KSib 问题是我的授权代码中的 YouTubeDataAPISample.YouTube.Auth.Store 。我应该放什么? 现在可以使用了。感谢大家的时间。问题是, FileDataStore("YouTubeDataAPISample.YouTube.Auth.Store")).Result;我将其更改为 new FileDataStore(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"), true)).Result;

以上是关于YouTube Data API v3 在生产服务器上部署时不起作用 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

php Youtube Data API v3

Auth0 登录调用 Youtube Data API v3

Youtube API v3 data.search 返回相同的值

如何使用 YouTube Data API v3 更改页面结果

Youtube Data API V3 - 使用 google.youtube.videos.list() 获取视频时出错

使用 YouTube Data API v3 确定 YouTube 频道的上传速率