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 に答える