WCF: метод вызова клиента, но не возврата - PullRequest
4 голосов
/ 19 мая 2011

серверная архитектура клиента. IIS не участвует. Оба приложения WinForm!

Я создал следующие интерфейсы в общей библиотеке:

[ServiceContract(SessionMode=SessionMode.Required,
        CallbackContract=typeof(ClientInterface))]
    public interface RequestInterface
    {
        [OperationContract]
        void Subscribe();

        [OperationContract]
        MyInterface GetInterface();
    }

    public interface MyInterface
    {
        [DataMember]
        List<MySubInterface> SubClasses{get;}
    }

    public interface MySubInterface
    {
        [DataMember]
        int Value { get; }
    }

И реализовал их на сервере так:

public class RequestHandler : RequestInterface
{
    private List<ClientInterface> iClients = new List<ClientInterface>();

    public MyInterface GetInterface()
    {
        List<MySubInterface> tList = new List<MySubInterface>();
        Form1.AddText("method invoked by:" + Thread.CurrentContext.ToString());
        foreach (RealSubclass tClass in Form1.iClass.SubClasses)
        {
            tList.Add(new TransmissionSubclass(tClass.Value));
        }

        TransmissionClass tTC = new TransmissionClass(tList);
        Form1.AddText("created:" + tTC);
        return tTC;
    }
    public void Subscribe()
    {
        Form1.AddText("subscribing:" + OperationContext.Current.GetCallbackChannel<ClientInterface>());
        iClients.Add(OperationContext.Current.GetCallbackChannel<ClientInterface>());
        fireClassEvent("halloWelt");
    }
}

На клиенте я делаю следующий фрагмент кода, пытаясь вызвать метод GetInterface ():

        ClientClass tClass = new ClientClass(this);
        DuplexChannelFactory<RequestInterface> pipeFactory =
         new DuplexChannelFactory<RequestInterface>(
            tClass,
            new NetNamedPipeBinding(),
            new EndpointAddress(
               "net.pipe://localhost/Request"));

        RequestInterface pipeProxy = pipeFactory.CreateChannel();

        //pipeProxy.Subscribe(); -- works like a charm
        MyInterface tInterface = pipeProxy.GetInterface(); // doesn't work
        fillListView(tInterface);

Однако при пошаговой отладке через клиент отладка прерывается на отмеченной строке и, похоже, выходит из этой функции.
Он возвращается в режим «шаг за шагом» только тогда, когда я закрываю форму приложения.
С другой стороны, по выходным данным журнала на моем сервере видно, что выполняется метод GetInterface ().
TransmissionClass и TransmissionSubclass находятся в общей библиотеке и реализуют MyInterface / MySubInterface

[DataContract]
[Serializable]
public class TransmissionClass : MyInterface
{
    [DataMember]
    public List<MySubInterface> SubClasses{get;private set;}

    public TransmissionClass(List<MySubInterface> aList)
    {
        SubClasses = aList;
    }

    public override string ToString()
    {
        return "TransmissionClass,Count:" + SubClasses.Count;
    }
}

WCF-инициализация на стороне сервера:

using (ServiceHost host = new ServiceHost(
            typeof(RequestHandler),
            new Uri[] { new Uri("net.pipe://localhost") }))
                    {

                        ServiceDebugBehavior tBehavior = new ServiceDebugBehavior();
                        if (null == tBehavior)
                        {
                            host.Description.Behaviors.Add(new ServiceDebugBehavior() { IncludeExceptionDetailInFaults = true });
                        }
                        else if (!tBehavior.IncludeExceptionDetailInFaults)
                        {
                            tBehavior.IncludeExceptionDetailInFaults = true;
                        }
                        host.AddServiceEndpoint(typeof(RequestInterface),
                          new NetNamedPipeBinding(), "Request");

                        host.Open();
                        Application.Run(new Form1());

                        host.Close();
        }

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Поместите атрибут [KnownTypes], чтобы WCF знал, какие конкретные классы реализуют ваш интерфейс.

1 голос
/ 19 мая 2011

Можете ли вы включить IncludeExceptionDetailInFaults в ServiceDebugBehavior и сообщить нам дополнительную информацию?

Убедитесь, что ваши TransmissionClasses сериализуются с правильными атрибутами (DataContract / DataMember / KnownType)

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