【问题标题】:How to inherit non-inherited attribute in c#如何在c#中继承非继承属性
【发布时间】:2017-12-18 11:07:56
【问题描述】:

这是我的情况:

  1. 我有一个基类和 70 个交付的类,它们继承自 这个。
  2. 我正在实现 WCF 命名管道,这 70 个类将是 客户。
  3. 需要异步接收和发送数据

对于第三篇文章,我使用[CallbackBehaviorAttribute(ConcurrencyMode = ConcurrencyMode.Multiple)] 属性,当我将它插入到交付的课程中时它可以工作。但是我应该在基类上插入属性,我不会花时间在所有交付的类上插入新属性或删除现有属性。但是当我插入基类时,它不能异步工作。因为CallbackBehaviorAttribute不是继承属性。

那么我该如何解决我上面提到的问题呢?我试图创建一个继承自CallbackBehaviorAttribute 的新属性,但它是密封的。

客户代码:

[CallbackBehaviorAttribute(ConcurrencyMode = ConcurrencyMode.Multiple)]
public abstract partial class BaseService : IDownloaderCallbackService
{
    public void connect_server_manager()
    {
        string address = "net.pipe://localhost/servermanager/";
        var factory = new DuplexChannelFactory<IDownloaderServiceContract>(new InstanceContext(this), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress(address));
        server_manager = factory.CreateChannel();
        logger.Info("Client Connected");

        logger.Info(string.Format(server_manager.Ping(this.this_service_id, new byte[1] { 0012 })));
        logger.Info(string.Format(server_manager.SetLastRequstTime(this.this_service_id, DateTime.Now)));

    }
}

服务器代码:

string address = "net.pipe://localhost/servermanager/";

serviceHost = new ServiceHost(service_manager);
NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
serviceHost.AddServiceEndpoint(typeof(IDownloaderServiceContract), binding, address);
serviceHost.Open();

Console.WriteLine("ServiceHost running. Press Return to Exit");

IDownloaderService合同代码:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IDownloaderCallbackService))]

public interface IDownloaderServiceContract
{
    [OperationContract]
    string Ping(uint service_id, byte[] p);
    [OperationContract]
    string Pong(uint service_id, byte[] p);

    [OperationContract]
    dynamic SetLastRequstTime(uint service_id, dynamic data);
}

【问题讨论】:

    标签: c# wcf asynchronous named-pipes


    【解决方案1】:

    我通过在连接代码块中将 ConcurrencyMode 设置为 True 解决了这个问题。

        string address = "net.pipe://localhost/servermanager/";
        var factory = new DuplexChannelFactory<IDownloaderServiceContract>(new InstanceContext(this), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress(address));
        ((CallbackBehaviorAttribute)factory.Endpoint.EndpointBehaviors[typeof(CallbackBehaviorAttribute)]).ConcurrencyMode = ConcurrencyMode.Multiple;
        server_manager = factory.CreateChannel();
    

    【讨论】:

      猜你喜欢
      • 2014-02-03
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2015-04-19
      相关资源
      最近更新 更多