使用F#在Azure辅助角色上托管SignalR时出现FileLoadException

jak*_*bka 4 f# azure signalr owin

我试图在Windows Azure工作者角色中运行SignalR自主服务器,但继续获取

System.IO.FileLoadException:无法加载文件或程序集"Microsoft.Owin,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)

当我在控制台应用程序中运行相同的代码时,它运行正常,一切都按预期工作.整个工作者角色用F#编写.下面是产生我正在谈论的异常的最短代码:

override wr.Run() =
    let x : IAppBuilder = null

    x.MapSignalR() |> ignore // this line throws the FileLoadException
Run Code Online (Sandbox Code Playgroud)

例外

当然上面的代码不应该工作,但有不同的例外.通常我在Startup类的Configuration()方法(WebApp.Start(url))中调用MapSignalR.

我粘贴的异常细节来自Compute模拟器,但我在实时Cloud Service中得到了同样的结果.

您是否知道可能导致问题的原因或我如何进一步诊断?

Pra*_*raj 7

这是Nuget的一个已知问题:请参阅此内容.绑定重定向不会自动添加到工作者角色项目中.这种失败的原因是SignalR二进制文件是依赖于Microsoft.Owin版本2.0.0构建的.但公共源中最新的Microsoft.Owin版本是2.0.2.要在控制台应用程序或Web应用程序上安装相同的SignalR软件包时修复此程序集绑定问题,您将在app.config中看到自动为您添加的程序集绑定重定向.由于Nuget客户端存在问题,因此在工作者角色项目中不会发生这种情况.要解决此问题,请将此添加到您的worker角色项目的app.config(或者尝试将您的signalR包添加到控制台应用程序并从其app.config复制粘贴绑定重定向):

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
Run Code Online (Sandbox Code Playgroud)