Обратный вызов WCF не выполняется - PullRequest
0 голосов
/ 22 июня 2011

Я уже один день гуглю это и не могу найти ответ.Надеясь, что кто-то может пролить свет на это.Я пытаюсь реализовать простой клиент-серверный вызов WCF с консольными приложениями на стороне клиента и сервера.Операция выполняется на сервере, и все, кажется, работает нормально, за исключением того, что обратный вызов не выполняется на клиенте.Т.е. он никогда не пишет «Callback call !!!», и точка останова, помещенная в callback, никогда не срабатывает.Клиент просто пишет «Готово».и ждет ввода пользователя.

Я уверен, что это что-то простое.Любая помощь будет принята с благодарностью.Спасибо!

//SERVER CODE:
namespace NodeServiceLib
{
    public interface ISomeCallbackContract
    {
        [OperationContract]
        void OnCallback();
    }

    [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]
    public interface IMyContract
    {
        [OperationContract]
        void DoSomething();
    }

    public class NodeService : IMyContract
    {
        public void DoSomething()
        {
            Console.WriteLine("I'm doing something!!!");
        }
    }
}

<configuration>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <bindings/>
    <services>
      <service name="NodeServiceLib.NodeService" behaviorConfiguration="MEX">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/Node" />
            <add baseAddress="net.tcp://localhost:8001/Node" />
          </baseAddresses>
        </host>
        <endpoint
          address="MyContract"
          binding="netTcpBinding"
          contract="NodeServiceLib.IMyContract"
        />
        <endpoint
          address="MEX"
          binding="mexHttpBinding"
          contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MEXGET">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
        <behavior name="MEX">
          <serviceMetadata/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup</configuration>



//CLIENT CODE:
namespace TestConsole
{
    [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
    class Callback : NodeServices.IMyContractCallback
    {
        public void OnCallback()
        {
            Console.WriteLine("Callback called!!!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            System.Threading.Thread.Sleep(5000); // Give server time to spin up

            Console.WriteLine("=== CLIENT ===");

            InstanceContext context = new InstanceContext(new Callback());
            NodeServices.MyContractClient proxy = new NodeServices.MyContractClient(context);
            proxy.DoSomething();
            Console.WriteLine("Done.");
            Console.ReadLine();
        }
    }
}

1 Ответ

2 голосов
/ 22 июня 2011

Разве вы не должны вызывать метод обратного вызова в методе DoSomething сервера?

...