使用FSharp.Data将Web应用程序部署到Azure网站

时间:2013-06-20 19:16:38

标签: c# asp.net-mvc f# azure-web-sites

这是与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”。

我能看到的唯一有效的解决方法是使用对DLL的显式引用替换所有NuGet引用(FSharp.Data,FSharp.Data.DesignTime,FSharp.Data.Experimental,FSharp.Data.Experimental.DesignTime),和复制本地设置为true。我不愿以这种方式把NuGet宝宝带出洗澡水。有更聪明的方式吗?或者,是否存在一个我可以加入投票的公开问题?

1 个答案:

答案 0 :(得分:2)

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