简体   繁体   中英

wcf server initiate method on client

I have a method on my WCF server that performs a callback as shown below. This works fine including the callback.

But how do i initiate the execution of the method on the client from the server. ie the code in the section C# Button code i would like to have below.

Currently the error i get is:

Object reference not set to an instance of an object.

Possibly my architecture is all wrong here and the WCF client also needs to have a WCF server built in?

C# method on WCF server

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# Button code on WCF server i would like to have

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 Service config

<?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>

Contracts

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);

    }
}

In your case I would recommend you to use wsDualHttpBinding: A secure and interoperable binding that is designed for use with duplex service contracts that allows both services and clients to send and receive messages. See for an example: http://blog.binarymist.net/2010/05/23/duplex-communication-and-callbacks-in-wcf/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM