2

这是一个与How do I deploy a web application using F# to Azure Web Site类似的问题。我的 C#/F# MVC 项目使用 FSharp.Data NuGet 包,部署过程失败并显示消息

找不到程序集“FSharp.Data,Version=1.1.4.0,Culture=neutral,PublicKeyToken=null”。

我能看到的唯一有效解决方法是将所有 NuGet 引用(FSharp.Data、FSharp.Data.DesignTime、FSharp.Data.Experimental、FSharp.Data.Experimental.DesignTime)替换为对 DLL 的显式引用,并复制本地设置为真。我不愿意以这种方式将 NuGet 婴儿与洗澡水一起扔出去。有没有更聪明的方法?或者,是否有一个我可以添加投票的未解决问题?

4

1 回答 1

2

您可以将<dependentAssembly>元素添加到您的项目中web.config,以确保FSharp.Data在将项目部署到 Azure 时包含程序集。我之前在将混合的 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\wwwrootWeb 服务器上的文件/文件夹)。检查bin文件夹 - 你看到FSharp.Data在那里组装?如果不是,这是构建/打包问题,而不是服务器问题;如果您确实看到了FSharp.Data程序集,请继续下一步。
  • 将您的项目部署到 Azure,然后将远程桌面部署到您的项目所在的实例之一。(在实例上启用远程桌面有一个特殊的过程——如果你还没有这样做,你需要在继续之前这样做。)登录后,你可以打开事件查看器(在管理工具下); 查看Windows 日志下的应用程序日志——那里有任何 ASP.NET 错误吗?如果是这样,请单击它们并查看错误消息,它可能包含有关无法解析程序集的 .NET 异常消息。如果是,请浏览并确保位于网站的文件夹中。如果是,请继续下一步。FSharp.DataC:\inetpub\wwwroot\FSharp.Databin
  • 如果FSharp.Data程序集与您的 Web 项目一起正确打包和部署,那么当您的项目在 .NET 4.5 上运行时,作为 .NET 4.0 程序集的它(或其依赖项之一)可能会出现一些问题。登录到 Azure 实例(通过远程桌面)时,您可以启用 Fusion 日志记录并使用 Fusion 日志查看器来跟踪 CLR 如何尝试加载程序集。如果您确实找到了该问题,解决该问题的可能方法是<bindingRedirect><dependentAssembly>您在web.config. FSharp.Core以下是我在 .NET 4.0 上的 F#/C# 项目中使用原始 F# PowerPack(针对 .NET 2.0 版本)的方法:

    <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>
    
于 2013-06-20T23:05:07.010 回答