【问题标题】:Microsoft.SqlServer.Types not functioning properly on Azure Worker RoleMicrosoft.SqlServer.Types 在 Azure 辅助角色上无法正常运行
【发布时间】:2015-12-05 17:01:39
【问题描述】:

我希望通过 EntityFramework 在 Azure Worker Role 中与 SQL Server 数据库通信来使用 DbGeography。据我了解,DbGeography 在后台使用 Microsoft.SqlServer.Types / SqlServerSpatial110.dll,所以为了让它在 Azure 中工作,我遵循了:

http://blogs.msdn.com/b/adonet/archive/2013/12/09/microsoft-sqlserver-types-nuget-package-spatial-on-azure.aspx 并安装了 nuget 包,然后我在 WorkerRole.cs 的 OnStart 方法中指定加载 SQL Server 类型:

public override bool OnStart()
        {
            // Load SQL Server Types
            SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

然后我还关注了这篇博文https://alastaira.wordpress.com/2011/08/19/spatial-applications-in-windows-azure-redux-including-denali/,在那里我明确地将 SqlServerSpatial110.dll 添加到项目中并将其设置为始终复制。

所以真正的问题是 - 部署后,一切都按预期工作。但是,如果我将 Azure Worker 角色单独放置一段时间(约 30 分钟)并且它没有收到任何请求,我的代码的 DbGeography 部分将不再起作用。

  • 我还有什么需要做的吗?
  • 我是否将 LoadNativeAssemblies 调用放在了错误的位置(应该在 Run() 上?)
  • Azure 辅助角色会被回收吗?
  • 之前是否有人遇到过这种情况/设法将 DbGeography 与 Azure Worker 角色一起使用,或者对可能发生的情况有任何见解?

【问题讨论】:

  • 另一个想法 - 这与 LoadLibrary 在 Azure Worker Role 中的功能有关吗?
  • 我尝试在 Run() 上使用它,但也没有帮助;当您进入 Client.OnMessage() 时,实例之间的 AppDomain 是否可能不同?

标签: c# sql-server entity-framework azure azure-worker-roles


【解决方案1】:

我已经确定我的问题是 EntityFramework 没有完全加载实体,而不是与 Microsoft.SqlServer.Types 有任何关系,但我留下这个问题而不是删除,以防万一它对某人有所帮助。

我不知道这样做是否正确,所以版主/聪明的人,请随意编辑或做任何事情。

【讨论】:

    【解决方案2】:

    回复很晚,但我在寻找解决方案时发现了您的问题。如何在 Azure Functions 中加载 SQL Server 类型。

    主要问题是运行代码的路径与其他应用程序类型不同。所以你不能使用建议的:

    SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin")); or
    SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
    

    在您的 Azure Function Run 参数中,添加允许您检索工作文件夹的 ExecutionContext 上下文。

    通过向上导航一级,您可以使用此路径来加载 SQL Server 类型:

    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log, ExecutionContext context)
    {
        string path = context.FunctionDirectory;
        string newPath = Path.GetFullPath(Path.Combine(path, @"..\"));
        SqlServerTypes.Utilities.LoadNativeAssemblies(newPath);
    

    【讨论】:

    • 如果大于10,还需要设置程序集版本。SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多