【问题标题】:netpipebinding with codedom assembly clientnetpipebinding 与 codedom 程序集客户端
【发布时间】:2011-12-18 00:26:50
【问题描述】:

(对不起我的英语),现在这是我第一次使用 WCF,所以我的问题可能很简单)所以:有一个来自 MSDN 的示例:1 个解决方案 - 2 个项目:服务和客户端像这样:服务:

<ServiceContract()> _
    Public Interface ICalculator
        <OperationContract()> _
        Function Openserv(ByVal n1 As Integer) As Boolean
    End Interface
Public Class Service
    Implements ICalculator

    Dim servicehost As System.ServiceModel.ServiceHost

    Private Sub Service_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim baseAddress As Uri = New Uri("http://localhost:8000/ServiceModelSamples/service")
        Dim address As String = "net.pipe://localhost/ServiceModelSamples/service"
        servicehost = New System.ServiceModel.ServiceHost(GetType(Service), baseAddress)
        Dim binding As System.ServiceModel.NetNamedPipeBinding = New System.ServiceModel.NetNamedPipeBinding(System.ServiceModel.NetNamedPipeSecurityMode.Transport)
        binding.CloseTimeout = New TimeSpan(0, 1, 0)
        binding.Name = "Binding1"
        binding.OpenTimeout = New TimeSpan(0, 1, 0)
        binding.ReceiveTimeout = New TimeSpan(0, 10, 0)
        binding.SendTimeout = New TimeSpan(0, 10, 0)
        binding.TransactionFlow = False
        binding.TransactionProtocol = System.ServiceModel.TransactionProtocol.OleTransactions
        binding.TransferMode = System.ServiceModel.TransferMode.Buffered
        binding.HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.StrongWildcard
        binding.MaxBufferPoolSize = 524288
        binding.MaxBufferSize = 65536
        binding.MaxConnections = 10
        binding.MaxReceivedMessageSize = 65536
        servicehost.AddServiceEndpoint(GetType(ICalculator), binding, address)
        Dim smb As System.ServiceModel.Description.ServiceMetadataBehavior = New System.ServiceModel.Description.ServiceMetadataBehavior
        smb.HttpGetEnabled = True
        servicehost.Description.Behaviors.Add(smb)
        servicehost.Open()
    End Sub
        Public Function Openserv(ByVal n1 As Integer) As Boolean _
    Implements ICalculator.Openserv
    If n1 > 0 Then
        filename &= n1 & ":"
    End If
    Dim result As Boolean = True
    Return result
End Function
End Class

客户:

<System.ServiceModel.ServiceContract()> _
    Public Interface ICalculatorClient
        <System.ServiceModel.OperationContract()> _
        Function Openserv(ByVal n1 As Integer) As Boolean
    End Interface
    Partial Public Class CalculatorClient
        Inherits System.ServiceModel.ClientBase(Of ICalculatorClient)
        Implements ICalculatorClient

        Public Sub New()
            MyBase.New()
        End Sub

        Public Sub New(ByVal endpointConfigurationName As String)
            MyBase.New(endpointConfigurationName)
        End Sub

        Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
            MyBase.New(endpointConfigurationName, remoteAddress)
        End Sub

        Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As System.ServiceModel.EndpointAddress)
            MyBase.New(endpointConfigurationName, remoteAddress)
        End Sub

        Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding, ByVal remoteAddress As System.ServiceModel.EndpointAddress)
            MyBase.New(binding, remoteAddress)
        End Sub

        Public Function OpenServ(ByVal n1 As Integer) As Boolean Implements ICalculatorClient.Openserv
            Return MyBase.Channel.Openserv(n1)
        End Function

    End Class
Public Class Client

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim bld As New System.ServiceModel.NetNamedPipeBinding
        Dim epa As New System.ServiceModel.EndpointAddress("net.pipe://localhost/servicemodelsamples/service")
        Dim client As New CalculatorClient(bld, epa)
        Dim value1 As Integer = 33
        Dim result As Boolean = client.OpenServ(value1)
        client.Close()
        MessageBox.Show("Открыто в основном приложении")

    End Sub
End Class

现在的问题是:当客户端是由应用程序服务生成的 codedom 程序集时,我该如何执行此示例?类似的东西:向应用程序服务的主要形式添加一个按钮并添加以下文本:

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        cr_text()
        cr_app()
    End Sub
    Private Sub cr_text()
        str_tb = "Imports System" & Chr(13) & Chr(10) & _
"Imports System.CodeDom" & Chr(13) & Chr(10) & _
"Imports System.CodeDom.Compiler" & Chr(13) & Chr(10) & _
"Imports System.Collections" & Chr(13) & Chr(10) & _
"Imports System.ComponentModel" & Chr(13) & Chr(10) & _
"Imports System.Diagnostics" & Chr(13) & Chr(10) & _
"Imports System.Windows.Forms" & Chr(13) & Chr(10) & _
"Imports System.Data" & Chr(13) & Chr(10) & _
"Imports System.Windows" & Chr(13) & Chr(10) & _
"Imports System.Data.SqlClient" & Chr(13) & Chr(10) & _
"Imports Microsoft.VisualBasic" & Chr(13) & Chr(10) & _
"Imports System.IO" & Chr(13) & Chr(10) & _
"Imports System.Drawing" & Chr(13) & Chr(10) & _
"Public Class MainClass" & Chr(13) & Chr(10) & _
"Public Shared Sub Main()" & Chr(13) & Chr(10) & _
"Dim tf As New test34" & Chr(13) & Chr(10) & _
"tf.show()" & Chr(13) & Chr(10) & _
"End Sub" & Chr(13) & Chr(10) & _
"End Class" & Chr(13) & Chr(10) & _
   "     <System.ServiceModel.ServiceContract()> _" & Chr(13) & Chr(10) & _
"    Public Interface ICalculator" & Chr(13) & Chr(10) & _
"        <System.ServiceModel.OperationContract()> _" & Chr(13) & Chr(10) & _
"        Function Openserv(ByVal n1 As Integer) As Boolean" & Chr(13) & Chr(10) & _
"    End Interface" & Chr(13) & Chr(10) & _
"    Partial Public Class CalculatorClient" & Chr(13) & Chr(10) & _
"        Inherits System.ServiceModel.ClientBase(Of ICalculator)" & Chr(13) & Chr(10) & _
"        Implements ICalculator" & Chr(13) & Chr(10) & _
"        Public Sub New()" & Chr(13) & Chr(10) & _
"            MyBase.New()" & Chr(13) & Chr(10) & _
"        End Sub" & Chr(13) & Chr(10) & _
"        Public Sub New(ByVal endpointConfigurationName As String)" & Chr(13) & Chr(10) & _
"            MyBase.New(endpointConfigurationName)" & Chr(13) & Chr(10) & _
"        End Sub" & Chr(13) & Chr(10) & _
"        Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)" & Chr(13) & Chr(10) & _
"            MyBase.New(endpointConfigurationName, remoteAddress)" & Chr(13) & Chr(10) & _
"        End Sub" & Chr(13) & Chr(10) & _
"        Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As System.ServiceModel.EndpointAddress)" & Chr(13) & Chr(10) & _
"            MyBase.New(endpointConfigurationName, remoteAddress)" & Chr(13) & Chr(10) & _
"        End Sub" & Chr(13) & Chr(10) & _
"        Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding, ByVal remoteAddress As System.ServiceModel.EndpointAddress)" & Chr(13) & Chr(10) & _
"            MyBase.New(binding, remoteAddress)" & Chr(13) & Chr(10) & _
"        End Sub" & Chr(13) & Chr(10) & _
"        Public Function OpenServ(ByVal n1 As Integer) As Boolean Implements ICalculator.Openserv" & Chr(13) & Chr(10) & _
"            Return MyBase.Channel.Openserv(n1)" & Chr(13) & Chr(10) & _
"        End Function" & Chr(13) & Chr(10) & _
"    End Class" & Chr(13) & Chr(10) & _
"        <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _" & Chr(13) & Chr(10) & _
"Partial Class test34" & Chr(13) & Chr(10) & _
"    Inherits System.Windows.Forms.Form" & Chr(13) & Chr(10) & _
"    <System.Diagnostics.DebuggerNonUserCode()> _" & Chr(13) & Chr(10) & _
"    Protected Overrides Sub Dispose(ByVal disposing As Boolean)" & Chr(13) & Chr(10) & _
"        Try" & Chr(13) & Chr(10) & _
"        If Disposing AndAlso components IsNot Nothing Then" & Chr(13) & Chr(10) & _
"        components.Dispose()" & Chr(13) & Chr(10) & _
"        End If" & Chr(13) & Chr(10) & _
"        Finally" & Chr(13) & Chr(10) & _
"        MyBase.Dispose(Disposing)" & Chr(13) & Chr(10) & _
"        End Try" & Chr(13) & Chr(10) & _
"    End Sub" & Chr(13) & Chr(10) & _
"        Private components As System.ComponentModel.IContainer" & Chr(13) & Chr(10) & _
"    <System.Diagnostics.DebuggerStepThrough()> _" & Chr(13) & Chr(10) & _
"    Private Sub InitializeComponent()" & Chr(13) & Chr(10) & _
"        Me.Button1 = New System.Windows.Forms.Button" & Chr(13) & Chr(10) & _
"        Me.Button3 = New System.Windows.Forms.TextBox" & Chr(13) & Chr(10) & _
"        Me.SuspendLayout()" & Chr(13) & Chr(10) & _
"        Me.Button1.Location = New System.Drawing.Point(114, 40)" & Chr(13) & Chr(10) & _
"        Me.Button1.Name = " & Chr(34) & "Button1" & Chr(34) & "" & Chr(13) & Chr(10) & _
"        Me.Button1.Size = New System.Drawing.Size(231, 39)" & Chr(13) & Chr(10) & _
"        Me.Button1.TabIndex = 0" & Chr(13) & Chr(10) & _
"        Me.Button1.Text = " & Chr(34) & "Button1" & Chr(34) & "" & Chr(13) & Chr(10) & _
"        Me.Button1.UseVisualStyleBackColor = True" & Chr(13) & Chr(10) & _
"        Me.Button3.Location = New System.Drawing.Point(114, 90)" & Chr(13) & Chr(10) & _
"        Me.Button3.Name = " & Chr(34) & "Button3" & Chr(34) & "" & Chr(13) & Chr(10) & _
"        Me.Button3.Size = New System.Drawing.Size(231, 39)" & Chr(13) & Chr(10) & _
"        Me.Button3.TabIndex = 2" & Chr(13) & Chr(10) & _
"        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)" & Chr(13) & Chr(10) & _
"        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font" & Chr(13) & Chr(10) & _
"        Me.ClientSize = New System.Drawing.Size(465, 133)" & Chr(13) & Chr(10) & _
"        Me.Controls.Add(Me.Button1)" & Chr(13) & Chr(10) & _
"        Me.Controls.Add(Me.Button3)" & Chr(13) & Chr(10) & _
"        Me.Name = " & Chr(34) & "test" & Chr(34) & "" & Chr(13) & Chr(10) & _
"        Me.Text = " & Chr(34) & "test" & Chr(34) & "" & Chr(13) & Chr(10) & _
"        Me.ResumeLayout(False)" & Chr(13) & Chr(10) & _
"    End Sub" & Chr(13) & Chr(10) & _
"        Friend WithEvents Button1 As System.Windows.Forms.Button" & Chr(13) & Chr(10) & _
"        Friend WithEvents Button3 As System.Windows.Forms.TextBox" & Chr(13) & Chr(10) & _
"End Class" & Chr(13) & Chr(10) & _
"Public Class test34" & Chr(13) & Chr(10) & _
"    Dim str_tb As String" & Chr(13) & Chr(10) & _
"    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click" & Chr(13) & Chr(10) & _
"        Dim bld As New System.ServiceModel.NetNamedPipeBinding" & Chr(13) & Chr(10) & _
"        Dim epa As New System.ServiceModel.EndpointAddress(" & Chr(34) & "net.pipe://localhost/servicemodelsamples/service" & Chr(34) & ")" & Chr(13) & Chr(10) & _
"        Dim client As New CalculatorClient(bld, epa)" & Chr(13) & Chr(10) & _
"        Dim value1 As Integer = Button3.Text" & Chr(13) & Chr(10) & _
"        Dim result As Boolean = client.OpenServ(value1)" & Chr(13) & Chr(10) & _
"        client.Close()" & Chr(13) & Chr(10) & _
"        MessageBox.Show(" & Chr(34) & "Открыто в основном приложении" & Chr(34) & ")" & Chr(13) & Chr(10) & _
"    End Sub" & Chr(13) & Chr(10) & _
"End Class"

    End Sub
    Private Shared Sub cr_app()
        Dim objCodeCompiler As System.CodeDom.Compiler.CodeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("VB")
        Dim objCompilerParameters As New System.CodeDom.Compiler.CompilerParameters()
        objCompilerParameters.ReferencedAssemblies.Add("mscorlib.dll")
        objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll")
        objCompilerParameters.ReferencedAssemblies.Add("System.dll")
        objCompilerParameters.ReferencedAssemblies.Add("C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\System.ServiceModel.dll")
        objCompilerParameters.ReferencedAssemblies.Add("System.Xml.dll")
        objCompilerParameters.ReferencedAssemblies.Add("System.Data.dll")
        objCompilerParameters.ReferencedAssemblies.Add("System.Drawing.dll")
        objCompilerParameters.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
        objCompilerParameters.CompilerOptions = "/target:winexe"
        objCompilerParameters.GenerateExecutable = True
        objCompilerParameters.GenerateInMemory = True
        objCompilerParameters.IncludeDebugInformation = False
        Dim objCompileResults As System.CodeDom.Compiler.CompilerResults = objCodeCompiler.CompileAssemblyFromSource(objCompilerParameters, str_tb)
        If objCompileResults.Errors.HasErrors Then
            MessageBox.Show(String.Format("Error: Line>{0}, {1} # {2}", objCompileResults.Errors(0).Line, objCompileResults.Errors(0).ErrorText, objCompileResults.Errors(0).ErrorNumber))
            Return
        End If
        Dim objAssembly As System.Reflection.Assembly = objCompileResults.CompiledAssembly
        Dim objTheClass As Object = objAssembly.CreateInstance("MainClass")
        If objTheClass Is Nothing Then
            MsgBox("Can't load class...")
            Exit Sub
        End If
        Try
            objTheClass.GetType.InvokeMember("Main", System.Reflection.BindingFlags.InvokeMethod, _
            Nothing, objTheClass, Nothing)
        Catch ex As Exception
            MsgBox("Error:" & ex.Message)
        End Try
    End Sub

但是客户端异常“超时已过期”......我怎样才能让它工作?也许使用其他东西代替netpipebinding?如果有帮助,我可以在 C# 上重写它。 主要问题:如何从生成的程序集中调用生成它的另一个子类?

【问题讨论】:

    标签: vb.net wcf codedom


    【解决方案1】:

    这是一个线程)))如果在另一个线程中运行程序集,它会很好用

    【讨论】:

      【解决方案2】:

      如果您使用的是 net.pipe,它只能在与服务相同的机器上工作,因此对于客户端可访问性,您应该改用 net.tcp 绑定。

      我建议先让客户端在没有 codedom 的情况下启动并运行,然后使用工作代码创建 codedom 实现。

      另外,我强烈建议您使用 System.Text.StringBuilder 来构建您的代码。字符串 concat 的效率和可读性要高得多。

      例如:

          str_tb = "Imports System" & Chr(13) & Chr(10) & _
      

      变成:

          Dim sbCode As New System.Text.StringBuilder(100000)
      
          sbCode.Append("Imports System").AppendLine()
      

      【讨论】:

      • 看来我还不够好(((我什至无法在没有配置文件的情况下在VB上使用net.tcp制作一个工作示例......也许有一个例子?
      • 我不明白为什么不能在一个项目中使用netnamedpipe,而是在不同的类中作为服务和客户端!也许可以使用一些功能,比如工厂之类的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2018-02-25
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多