使用FSharp部署web应用程序.数据到Azure网站

本文关键字:Azure 网站 数据 应用程序 FSharp 部署 web 使用 | 更新日期: 2023-09-27 18:19:11

这是一个类似于如何使用f#将web应用程序部署到Azure web站点的问题。我的c#/f# MVC项目使用了FSharp。数据NuGet包,部署过程失败,提示

无法定位程序集"FSharp "。数据,版本=1.1.4.0,文化=中性,PublicKeyToken=null".

我能看到的唯一有效的解决方案是替换所有的NuGet引用(FSharp)。数据,FSharp.Data。DesignTime FSharp.Data。Experimental, FSharp.Data.Experimental.DesignTime),并显式引用dll,并将Copy Local设置为true。我不愿意以这种方式把NuGet的宝宝连同洗澡水一起倒掉。有没有更聪明的方法?或者,是否有一个悬而未决的问题我可以投上我的一票?

使用FSharp部署web应用程序.数据到Azure网站

您可以添加元素添加到web.config,以确保在将项目部署到Azure时包含FSharp.Data程序集。我以前在部署f#/c#混合ASP时使用过这种技术。. NET MVC项目到Azure;它已经有一段时间了,但我不认为我必须改变引用程序集上的Copy Local设置(我通过NuGet添加)。

无论如何,您需要添加的条目应该看起来像这样:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Data" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

根据Rob的评论,他仍然得到相同的错误信息,以下是我将采取的下一步步骤来诊断问题。

    构建Azure部署包(您不需要部署它)。构建完成后,找到部署包文件(*.cspkg);这实际上只是一个zip文件,所以将内容解压缩到一个文件夹中,例如,使用7-zip。在解压的文件夹中,应该有一个扩展名为*.cssx的文件,它比其他文件大得多;它也是一个zip文件,所以把它解压缩到另一个文件夹中,然后用Windows资源管理器浏览那个文件夹。从那里,进入sitesroot文件夹,然后进入0文件夹。你现在应该看到你的网站的根(即,文件/文件夹,将被复制到C:'inetpub'wwwroot上的web服务器)。检查bin文件夹——你在那里看到FSharp.Data程序集了吗?如果不是,这是构建/打包问题,而不是服务器问题;如果您确实看到FSharp.Data组装,请继续下一步。
  • 将项目部署到Azure,然后将远程桌面部署到托管项目的实例之一。(在实例上启用Remote Desktop有一个特殊的过程——如果您还没有这样做,在继续之前需要这样做。)登录后,您可以打开事件查看器(在管理工具下);查看Windows日志下的应用程序日志——是否有任何ASP。有。NET错误吗?如果是,单击它们并查看错误消息,它可能包含关于无法解析FSharp.Data程序集的. net异常消息。如果是,浏览到C:'inetpub'wwwroot',并确保FSharp.Data在网站的bin文件夹中。如果是,继续下一步。
  • 如果FSharp.Data程序集与您的web项目一起被打包和正确部署,那么当您的项目在。net 4.5上运行时,它(或它的依赖项之一)作为。net 4.0程序集可能会出现一些问题。在登录到Azure实例(通过远程桌面)时,您可以启用Fusion日志记录,并使用Fusion日志查看器跟踪CLR如何尝试加载程序集。如果您确实跟踪了这个问题,修复它的可能方法是在您在web.config中创建的<dependentAssembly>条目中添加<bindingRedirect>元素。以下是我如何在。net 4.0上的f#/c#项目中获得原始f# PowerPack(针对。net 2.0版本的FSharp.Core)的方法:

    <dependentAssembly>
      <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>