【发布时间】:2018-06-24 13:59:07
【问题描述】:
按照 ASP.NET MVC 示例 here,我在我的 Web 应用程序中实现了 Google Admin SDK,以便我可以使用目录服务获取与组织单位关联的组织单位和/或用户的列表。
在本地一切正常(身份验证回调有效,因为我利用ngrok 来访问我的本地框),但是当我部署到 MS Azure 中的云服务时,应用程序无法启动,并且我看到以下错误在事件日志中:
无法创建角色入口点:System.TypeLoadException:由于以下异常,无法加载角色入口点: -- System.IO.FileLoadException:无法加载文件或程序集“System.Web.Mvc,版本=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040) 文件名:'System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
我在我的 .NET 4.5 Web 应用程序中使用 ASP.NET MVC 版本 5.2.3,并在我的 web.config 中使用以下设置。我不清楚这个明确的引用来自版本 4.0.0.0 的确切位置,但我已经重新部署了我的应用程序,有和没有对 Google API 库的引用,以及错误 当我引用 Google API 库时肯定会发生。
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
最初几次出现错误时,我认为是因为我在 AppFlowMetadata 类中使用了 FileDataStore 对象,并且本地文件存储在 Azure 云服务中可能不可用。所以找到this SO post,我创建了自己的数据库存储,它实现了 IDataStore 接口,并且在本地也很好用,但是部署到 Azure 会导致与上面列出的相同的错误。
有谁知道 Azure 部署失败的原因以及引用 System.Web.MVC Version=4.0.0.0 的原因/位置?
public class AppFlowMetadata : FlowMetadata
{
public AppFlowMetadata()
{
}
private static readonly IAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "CLIENT-ID",
ClientSecret = "CLIENT-SECRET"
},
Scopes = new[] { DirectoryService.Scope.AdminDirectoryOrgunit, DirectoryService.Scope.AdminDirectoryUser },
DataStore = new GoogleDBDataStore()
});
public override string GetUserId(Controller controller)
{
var user = controller.Session["user"] as USER;
if (user != null)
{
return user.UserID.ToString();
}
else
{
return null;
}
}
public override IAuthorizationCodeFlow Flow
{
get { return flow; }
}
}
【问题讨论】:
标签: c# azure google-api google-admin-sdk google-api-dotnet-client