使用Powershell创建signalR客户端HubConnection

时间:2017-06-15 16:49:12

标签: c# asp.net powershell nuget signalr

我正在尝试使用powershell脚本连接到SignalR中心。我对powershell很新,所以请原谅任何新手的错误。

我已经设置了一个最小的工作示例,我在这里尝试过: Gist

相关代码:

加载dll

$dllFolder = -join((Get-Item -Path ".\" -Verbose).FullName, "\bin\Debug\")
[string[]] $dllPathsToLoad = @("\Newtonsoft.Json.dll", "\Microsoft.AspNet.SignalR.Client.dll")
$token = "insertyourtokenhere"

function LoadDllPaths($dlls)
{
    foreach ($dll in $dlls)
    {
        $dllpath = $dllFolder + $dll
        [System.Reflection.Assembly]::LoadFrom($dllpath)
    }
}
[...]
LoadDllPaths($dllPathsToLoad)

创建HubConnection:

$server = "https://localhost/rest/"
[...]
$hub = New-Object Microsoft.AspNet.SignalR.Client.HubConnection($server)

步骤:

  1. 创建一个新的Visual Studio项目
  2. 添加Newtonsoft.Json v10.0.2 Nuget包(最新)
  3. 添加Microsoft.AspNet.SignalR.Client v2.2.2 Nuget包(最新)
  4. 将powershell脚本添加到项目的根目录
  5. 使用powershell(以管理员身份运行),键入.\HubConnectionTestsScript.ps1
  6. 结果:

    output View on imgur

    Error : System.Management.Automation.MethodInvocationException: Exception calling ".ctor" with "1" argument(s): "Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified." ---> System.IO.FileNotFoundException: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified.
       at Microsoft.AspNet.SignalR.Client.Connection..ctor(String url, String queryString)
       at Microsoft.AspNet.SignalR.Client.HubConnection..ctor(String url, Boolean useDefaultUrl)
       --- End of inner exception stack trace ---
       at System.Management.Automation.DotNetAdapter.AuxiliaryConstructorInvoke(MethodInformation methodInformation, Object[] arguments, Object[] originalArguments)
       at System.Management.Automation.DotNetAdapter.ConstructorInvokeDotNet(Type type, ConstructorInfo[] constructors, Object[] arguments)
       at Microsoft.PowerShell.Commands.NewObjectCommand.CallConstructor(Type type, ConstructorInfo[] constructors, Object[] args)
    

    This signalR source code object似乎是问题所在,我只是看不出它的哪一部分会引发这个错误。

    问题:

    为什么当signalR dependencies>=6.0.4并且我有10.0.2时错误提到了Newtonsoft.Json v6.0.0?

    我的Powershell脚本中是否有任何错误可能导致此问题?

    非常感谢!此时感谢任何帮助

1 个答案:

答案 0 :(得分:2)

我设法在同事的帮助下解决了这个问题。在这里分享解决方案,以防任何人遇到同样的问题。

似乎有一个SignalR依赖项试图加载旧版本的Newtonsoft.Json。我们可以强制它将他重定向到我们自己的Newtonsoft.Json实例

this gist的启发,这是一个想法:

加载Json程序集时,将其存储在变量

$newtonsoftAssembly = [System.Reflection.Assembly]::LoadFrom($dllFolder + "\Newtonsoft.Json.dll")

然后,设置重定向绑定。我最好的猜测就是拦截任何加载程序集的调用,让我们有机会返回我们自己的Json程序集,而不是让他找不到他想要的版本(在我的情况下是6.0.0)。

function RedirectJsonBindings()
{
    $onAssemblyResolveEventHandler = [System.ResolveEventHandler] {
        param($sender, $e)
        # You can make this condition more or less version specific as suits your requirements
        if ($e.Name.StartsWith("Newtonsoft.Json")) {
            Write-Host "Newtonsoft assembly" $e.Name -ForegroundColor DarkGreen
            return $newtonsoftAssembly
        }
        foreach($assembly in [System.AppDomain]::CurrentDomain.GetAssemblies()) {
            if ($assembly.FullName -eq $e.Name) {
                return $assembly
            }
        }
        return $null
    }
    [System.AppDomain]::CurrentDomain.add_AssemblyResolve($onAssemblyResolveEventHandler)

}

最后,在脚本结束时,取消绑定

# Detach the event handler (not detaching can lead to stack overflow issues when closing PS)
[System.AppDomain]::CurrentDomain.remove_AssemblyResolve($onAssemblyResolveEventHandler)