NetNamedPipeBinding:管道方法中的参数为空

本文关键字:参数 管道 方法 NetNamedPipeBinding | 更新日期: 2023-09-27 18:00:43

我有一个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);
    }
}

NetNamedPipeBinding:管道方法中的参数为空

看起来它与proxy.PipeRequest(this); 有关。您需要传入一个继承ServiceRequestBase的类,如果您的类确实继承了ServiceRequestBase,那么它可能无法序列化。

事实证明,我必须指定(作为数据契约的一部分)ServiceRequestBase类中的任何派生类。

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