WCF服务器在客户端启动方法

本文关键字:启动 方法 客户端 服务器 WCF | 更新日期: 2023-09-27 18:02:01

我的WCF服务器上有一个执行回调的方法,如下所示。包括回调在内都可以正常工作。

但是我如何从服务器启动客户机上的方法的执行。即代码在部分 c#按钮代码,我想有下面。

目前我得到的错误是:

Object reference not set to an instance of an object.

可能我的架构是错误的在这里和WCF客户端也需要有一个WCF服务器内置?

WCF服务器上的c#方法
public void ChatToServer(string texttoServer) // send some text to the server
{
    Logging.Write_To_Log_File("Entry", MethodBase.GetCurrentMethod().Name, "", "", "", 1);
    try
    {
        IMyContractCallBack callback = OperationContext.Current.GetCallbackChannel<IMyContractCallBack>();
        callback.ChatToClient("your message: " + texttoServer + " has been recieved");          
        Logging.Write_To_Log_File("Exit", MethodBase.GetCurrentMethod().Name, "", "", "", 1);
    }
    catch (Exception ex)
    {
        Logging.Write_To_Log_File("Error", MethodBase.GetCurrentMethod().Name, "", "", ex.ToString(), 2);
    }
}

c#按钮代码在WCF服务器上,我想有

private void radButtonSend_Click(object sender, EventArgs e)
        {
            try
            {
                Logging.Write_To_Log_File("Entry", MethodBase.GetCurrentMethod().Name, "", "", "", 1);
                IMyContractCallBack callback = OperationContext.Current.GetCallbackChannel<IMyContractCallBack>();
                callback.ChatToClient(radTextBox2Send.Text);   
                Logging.Write_To_Log_File("Exit", MethodBase.GetCurrentMethod().Name, "", "", "", 1);
            }
            catch (Exception ex)
            {
                Logging.Write_To_Log_File("Error", MethodBase.GetCurrentMethod().Name, "", "", ex.ToString(), 2);
                MessageBox.Show(ex.Message.ToString());
            }
        }

WCF服务配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Throttled">
          <serviceMetadata httpGetEnabled="False" />
          <serviceDebug includeExceptionDetailInFaults="False" />
          <serviceThrottling maxConcurrentCalls="100000" maxConcurrentInstances="100000" maxConcurrentSessions="100000" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  <services>
    <service name="WCFService.WCFJobsLibrary" behaviorConfiguration="Throttled" >
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:8732/Design_Time_Addresses/WCFService/WCFJobsLibrary/" />
        </baseAddresses>
      </host>
      <endpoint name ="duplexendpoint"
          address =""
          binding ="wsDualHttpBinding"
          contract ="WCFService.IWCFJobsLibrary"/>
      <endpoint name ="MetaDataTcpEndpoint"
                address="mex"
                binding="mexHttpBinding"
                contract="IMetadataExchange"/>
    </service>
  </services>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

WCF Client Config

<configuration>
  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="duplexendpoint" closeTimeout="00:01:00" openTimeout="00:01:00"
          receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
          transactionFlow="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
          textEncoding="utf-8" useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" />
          <security mode="Message">
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:8732/Design_Time_Addresses/WCFService/WCFJobsLibrary/"
        binding="wsDualHttpBinding" bindingConfiguration="duplexendpoint"
        contract="ServiceReference1.IWCFJobsLibrary" name="duplexendpoint">
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

namespace WCFService
{
    [ServiceContract(CallbackContract = typeof(IMyContractCallBack))]
    public interface IWCFJobsLibrary
    {
        [OperationContract(IsOneWay = true)]
        void ChatToServer(string texttoServer); // send some text to the server
        [OperationContract(IsOneWay = true)]
        void NormalFunction();
        [OperationContract(IsOneWay = false)]
        int ChatToServerWithResult(string texttoServer); // send some text to the server and send back success indication
    }
    public interface IMyContractCallBack
    {
        [OperationContract(IsOneWay = true)]
        void CallBackFunction(string str);

        [OperationContract(IsOneWay = true)]
        void ChatToClient(string str);
    }
}

WCF服务器在客户端启动方法

在您的情况下,我建议您使用wsDualHttpBinding: 一个安全且可互操作的绑定,设计用于双工服务契约,允许服务和客户端发送和接收消息。示例如下:http://blog.binarymist.net/2010/05/23/duplex-communication-and-callbacks-in-wcf/