NetNamedPipeBinding: параметр в методе канала пуст - PullRequest
0 голосов
/ 30 июня 2011

У меня есть ServiceHost, прослушивающий конечную точку NetNamedPipeBinding. У меня есть класс контракта на обслуживание с одним методом, который вызывается клиентом и обрабатывается сервером. У метода (назовем его PipeRequest ()) есть параметр Request. На стороне клиента я заполняю этот объект, но к моменту отправки на сервер он пуст. Есть идеи, почему это так?

_Host = new ServiceHost(typeof(PipeService), new Uri(ServiceRequestRouter.URI));
_Host.AddServiceEndpoint(
    typeof(IPipeService),
    new NetNamedPipeBinding(),
    _PipeName
);
_Host.Open();

[ServiceContract(Namespace = "http://www.example.com/PipeCommunication")]
interface IPipeService
{
    [OperationContract]
    void PipeRequest(ServiceRequestBase request);
}

[DataContract]
[KnownType(typeof(DerivedServiceRequest))]
[KnownType(typeof(SomeEnumType))]
public abstract class ServiceRequestBase
{
    ...

    public void Dispatch(string pPipeName = ServiceRequestRouter.DefaultPipeName)
    {
        EndpointAddress epa = new EndpointAddress(_address_));
        IPipeService proxy = ChannelFactory<IPipeService>.CreateChannel(new NetNamedPipeBinding(), epa);
        proxy.PipeRequest(this);
    }
}

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Похоже, что это связано с proxy.PipeRequest(this); Вам нужно передать класс, который наследует ServiceRequestBase, если ваш класс наследует ServiceRequestBase, то он может быть не сериализуемым.

0 голосов
/ 05 августа 2011

Оказывается, мне пришлось указать (как часть контракта на данные) любые производные классы из класса ServiceRequestBase.

[DataContract]
[KnownType(typeof(CitrixInfoServiceRequest))]   // added this line
[KnownType(typeof(RegStateServiceRequest))] // added this line
public abstract class ServiceRequestBase
{
    // ...
}
...