1

我的 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);
    }

}

我想要的 WCF 服务器上的 C# 按钮代码

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 客户端配置

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

    }
}
4

1 回答 1

1

在您的情况下,我建议您使用 wsDualHttpBinding:一种安全且可互操作的绑定,旨在与允许服务和客户端发送和接收消息的双工服务合同一起使用。 参见示例:http ://blog.binarymist.net/2010/05/23/duplex-communication-and-callbacks-in-wcf/

于 2013-03-04T14:25:11.000 回答