remote call

master
xieguigang 7 years ago
parent 2b34d21af6
commit 577fd5ac91

@ -231,6 +231,7 @@
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Compile Include="Taskhost.d\Invoke\JSON\Argument.vb" />
<Compile Include="Taskhost.d\Invoke\RemoteCall.vb" />
<Compile Include="Taskhost.d\Invoke\TaskInvoke.vb" />
<Compile Include="Linq\LinqPool.vb" />
<Compile Include="Linq\ILinq%28Of T%29.vb" />

@ -1,48 +1,49 @@
#Region "Microsoft.VisualBasic::4c6028116bed86fe45bf6a4e74f0af36, ComputingServices\Taskhost.d\Extensions.vb"
' Author:
'
' asuka (amethyst.asuka@gcmodeller.org)
' xie (genetics@smrucc.org)
' xieguigang (xie.guigang@live.com)
'
' Copyright (c) 2018 GPL3 Licensed
'
'
' GNU GENERAL PUBLIC LICENSE (GPL3)
'
'
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation, either version 3 of the License, or
' (at your option) any later version.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU General Public License
' along with this program. If not, see <http://www.gnu.org/licenses/>.
' /********************************************************************************/
' Summaries:
' Module Extensions
'
' Properties: EnvironmentLocal, IPAddress, PublicShared
'
' Constructor: (+1 Overloads) Sub New
' Function: [AddressOf], AddressEquals, (+2 Overloads) Invoke
'
'
' /********************************************************************************/
' Author:
'
' asuka (amethyst.asuka@gcmodeller.org)
' xie (genetics@smrucc.org)
' xieguigang (xie.guigang@live.com)
'
' Copyright (c) 2018 GPL3 Licensed
'
'
' GNU GENERAL PUBLIC LICENSE (GPL3)
'
'
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation, either version 3 of the License, or
' (at your option) any later version.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU General Public License
' along with this program. If not, see <http://www.gnu.org/licenses/>.
' /********************************************************************************/
' Summaries:
' Module Extensions
'
' Properties: EnvironmentLocal, IPAddress, PublicShared
'
' Constructor: (+1 Overloads) Sub New
' Function: [AddressOf], AddressEquals, (+2 Overloads) Invoke
'
'
' /********************************************************************************/
#End Region
Imports System.Reflection
Imports System.Runtime.CompilerServices
Imports Microsoft.VisualBasic.Net.Tcp
@ -85,9 +86,7 @@ Namespace TaskHost
#End If
End Sub
Public ReadOnly Property PublicShared As System.Reflection.BindingFlags =
System.Reflection.BindingFlags.Public Or
System.Reflection.BindingFlags.Static
Public ReadOnly Property PublicShared As BindingFlags = BindingFlags.Public Or BindingFlags.Static
''' <summary>
'''
@ -107,7 +106,7 @@ Namespace TaskHost
<Extension> Public Function Invoke(info As InvokeInfo, host As TaskRemote) As Object
If host Is Nothing Then
Return TaskInvoke.TryInvoke(info)
Return RemoteCall.doCall(info)
Else
Dim rtvl = host.Invoke(info)
Dim entry = info.GetMethod

@ -0,0 +1,46 @@
Imports System.Reflection
Imports System.Runtime.CompilerServices
Imports Microsoft.VisualBasic.Serialization.JSON
Imports sciBASIC.ComputingServices.TaskHost
Module RemoteCall
''' <summary>
''' Invoke the function on the remote server.()
''' </summary>
''' <param name="params"></param>
''' <returns></returns>
'''
<Extension>
Public Function Invoke(params As InvokeInfo) As Rtvl
Dim rtvl As Rtvl
Try
Dim value As Object = doCall(params)
rtvl = New Rtvl(value)
Catch ex As Exception
ex = New Exception(params.GetJson, ex)
rtvl = New Rtvl(ex)
End Try
Return rtvl
End Function
''' <summary>
''' A common function of invoke the method on the remote machine
''' </summary>
''' <param name="params"></param>
''' <returns></returns>
'''
<Extension>
Public Function doCall(params As InvokeInfo) As Object
Dim func As MethodInfo = params.GetMethod
Dim paramsValue As Object() = params.parameters _
.Select(Function(arg) arg.GetValue) _
.ToArray
Dim value As Object = func.Invoke(Nothing, paramsValue)
Return value
End Function
End Module

@ -82,48 +82,10 @@ Namespace TaskHost
Public ReadOnly Property LinqProvider As LinqPool = New LinqPool
''' <summary>
''' Invoke the function on the remote server.()
''' </summary>
''' <param name="params"></param>
''' <returns></returns>
Public Shared Function Invoke(params As InvokeInfo) As Rtvl
Dim rtvl As Rtvl
Try
Dim rtvlType As Type = Nothing
Dim value As Object = __invoke(params, rtvlType)
rtvl = New Rtvl(value, rtvlType)
Catch ex As Exception
ex = New Exception(params.GetJson, ex)
rtvl = New Rtvl(ex)
End Try
Return rtvl
End Function
''' <summary>
''' A common function of invoke the method on the remote machine
''' </summary>
''' <param name="params"></param>
''' <param name="value">value's <see cref="system.type"/></param>
''' <returns></returns>
Private Shared Function __invoke(params As InvokeInfo, ByRef value As Type) As Object
Dim func As MethodInfo = params.GetMethod
Dim paramsValue As Object() = params.parameters.Select(Function(arg) arg.GetValue).ToArray
Dim x As Object = func.Invoke(Nothing, paramsValue)
value = func.ReturnType
Return x
End Function
Public Shared Function TryInvoke(info As InvokeInfo) As Object
Return __invoke(info, Nothing)
End Function
<Protocol(TaskProtocols.Invoke)>
Private Function Invoke(CA As Long, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
Dim params As InvokeInfo = JsonContract.LoadJSON(Of InvokeInfo)(args.GetUTF8String)
Dim value As Rtvl = Invoke(params)
Dim value As Rtvl = RemoteCall.Invoke(params)
Return New RequestStream(value.GetJson)
End Function
@ -144,10 +106,9 @@ Namespace TaskHost
<Protocol(TaskProtocols.InvokeLinq)>
Private Function InvokeLinq(CA As Long, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
Dim params As InvokeInfo = JsonContract.LoadJSON(Of InvokeInfo)(args.GetUTF8String) '
Dim type As Type = Nothing
Dim value As Object = __invoke(params, type)
Dim value As Object = RemoteCall.doCall(params)
Dim source As IEnumerable = DirectCast(value, IEnumerable)
Dim svr As String = LinqProvider.OpenQuery(source, type).GetJson '
Dim svr As String = LinqProvider.OpenQuery(source, value.GetType).GetJson '
Return New RequestStream(svr)
End Function

Loading…
Cancel
Save