WCF вызывает обратный вызов из статических методов - PullRequest
1 голос
/ 14 июня 2011

Я очень новичок в WCF и пытаюсь учиться, но мне кажется, что мне здесь не хватает чего-то значительного, и я знаю об этом, поэтому, пожалуйста, будьте добры. Я работаю с ранее существовавшим консольным приложением, к которому я добавил хост WCF, это упрощенная версия, но оно должно дать вам представление о нем

namespace mynamespace
{

    public class MyConsoleApp
    {
        static void Main(string[] args)
        {
          CreateRemoteDebugHost();
          StartLongRunningMethods();
        }
        public static void StartLongRunningMethods()
        {
        LongRunningMethod1();
        LongRunningMethod2();
        }
        public static void LongRunningMethod1()
        {}
        public static void LongRunningMethod2()
        {}
        public void CreateRemoteDebugHost()
        {

            ServiceHost host = new ServiceHost(typeof(RemoteDebug), new Uri("net.pipe://localhost"));
            host.AddServiceEndpoint(typeof(IRemoteDebug), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "PipeRemoteDebug");

            //Create mex           
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            smb.HttpGetUrl = new Uri("http://localhost:8001/RemoteDebug");
            host.Description.Behaviors.Add(smb);

            host.Open();
        }
    }

    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IRemoteDebugCallback))]
    public interface IRemoteDebug
    {
        [OperationContract]
        string Message(string message);
    }

    public interface IRemoteDebugCallback
    {
        [OperationContract(IsOneWay = true)]
        void OnMessage(string callbackValue);
    }

    public class RemoteDebug : IRemoteDebug
    {

        public string Message(string message)
        {
            IRemoteDebugCallback callback = OperationContext.Current.GetCallbackChannel<IRemoteDebugCallback>();               
            callback.OnMessage(message);
            return message;                
        }


    }

}

Как вы, вероятно, можете сказать, я пытаюсь отправить отладочные сообщения или сообщения о состоянии обратно клиенту (-ам) из давно работающих статических методов. Кажется, что вся сантехника работает правильно, хост подходит, я могу добавить ссылку на службу в мое клиентское приложение, но проблема возникает, когда я пытаюсь вызвать обратный вызов WCF из статических методов longrunningprocesses. Я не могу понять, как это сделать правильно.

Что также очень сбивает с толку, так это то, что почти каждый пример WCF и обратных вызовов предполагает, что все, что вы делаете, выполняется из контекста самого хоста WCF, очевидно, в моем примере это не так. Я знаю, что, наверное, все об этом не так, так что, может, кто-нибудь объяснит мне это? Любая помощь с благодарностью.

ТИА!

1 Ответ

1 голос
/ 14 июня 2011

Существует клиент (не путать с клиентской программой), созданный также через app.config или вручную (например, public class MyClient: ClientBase<IRemoteDebug> или public class MyClient: DuplexClientBase<IRemoteDebug>, IRemoteDebug).Это должно отправлять сообщения клиентским программам.Пример использования DuplexClient выше из некоторого кода, который у меня был:

[CallbackBehaviorAttribute(UseSynchronizationContext = true)]
public class SubCallback : IRemoteDebug 
{
      public void Event(SomeClass evt)
      {
         // some handling code using: 
         //public delegate void EventCallbackHandler(SomeClass evt);
      }
 }
InstanceContext ctx = new InstanceContext(new SubCallback ());


MyClient _client = new MyClient(
            ctx,
            new NetNamedPipeBinding(NetNamedPipeSecurityMode.None),
            new EndpointAddress("net.pipe://localhost/ServiceEndpointName"));

Кроме того, вы можете передать некоторые параметры вашей службе, например:

    [ServiceBehavior(
        InstanceContextMode = InstanceContextMode.Single,
        ConcurrencyMode = ConcurrencyMode.Single)]
    public class RemoteDebug : IRemoteDebug
    {}

Это может быть связано со многими причинамиВаша конкретная проблема, но это решило проблемы для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...