就是订阅 之类的问题。 我自己写的程序出问题,然后 就 干脆把 网上的程序 直接拷贝了用,还是出问题。
发布模式都是 Singleton,信道也做过处理( TypeFilterLevel = TypeFilterLevel.Full), 当Issuer 使用方式一的时候就失败,但是使用方式二 就成功, 使用方式一的时候 错误信息是:
System.Runtime.Serialization.SerializationException: Cannot find the assembly EventSubscriber, Version=1.0.2109.39469, Culture=neutral, PublicKeyToken=null.EventSubscriber是 工程名, 里面一个类就是 Subscriber , 另外一个工程是 EventIssuer, 饱含一个类是 Issuer ,最后一个就是EventClient工程, public class Subscriber : MarshalByRefObject
{
/// <summary>
/// Subscribe event from server.
/// </summary>
public void Subscribe(string argMessage)
{
Debug.WriteLine(argMessage);
}}public class Issuer : MarshalByRefObject
{
public delegate void Notify(string argMessage); public event Notify NotifyEvent; public Issuer()
{
} /// <summary>
/// Event happen.
/// </summary>
public void Happen()
{
Debug.WriteLine("Event happened.");
if (null != NotifyEvent)
{
NotifyEvent("Has suscribers.");
}
}
}class MainClass
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
Subscriber subscriber = (Subscriber)Activator.GetObject(typeof(Subscriber),
"http://localhost:1000/Subscriber"); subscriber.Subscribe("123"); // ****** 运行到这里正常 Subscriber正确的打印了信息(123)
Issuer issuer = (Issuer)Activator.GetObject(typeof(Issuer), // ********* 方式一
"http://localhost:1080/Issuer"); // Issuer issuer = new Issuer(); // ********* 方式二 issuer.Happen(); // ****** 运行到这里也正常,Issuer 正确的打印了信息(Event happened.) if (subscriber != null && issuer != null)
{
// ****** 当使用方式一的时候, 下面这一句出错
issuer.NotifyEvent += new EventIssuer.RemoteObject.Issuer.Notify(subscriber.Subscribe); // ****** 当使用方式一的时候, 下面这一句不会被执行到。
// ****** 使用方式二的时候下面这句被正常执行
// ****** 并且,Issuer 正确的打印了信息(Event happened.)
// ****** Subscriber也 正确的打印了信息(Has suscribers.)。
issuer.Happen();
}
}
}
发布模式都是 Singleton,信道也做过处理( TypeFilterLevel = TypeFilterLevel.Full), 当Issuer 使用方式一的时候就失败,但是使用方式二 就成功, 使用方式一的时候 错误信息是:
System.Runtime.Serialization.SerializationException: Cannot find the assembly EventSubscriber, Version=1.0.2109.39469, Culture=neutral, PublicKeyToken=null.EventSubscriber是 工程名, 里面一个类就是 Subscriber , 另外一个工程是 EventIssuer, 饱含一个类是 Issuer ,最后一个就是EventClient工程, public class Subscriber : MarshalByRefObject
{
/// <summary>
/// Subscribe event from server.
/// </summary>
public void Subscribe(string argMessage)
{
Debug.WriteLine(argMessage);
}}public class Issuer : MarshalByRefObject
{
public delegate void Notify(string argMessage); public event Notify NotifyEvent; public Issuer()
{
} /// <summary>
/// Event happen.
/// </summary>
public void Happen()
{
Debug.WriteLine("Event happened.");
if (null != NotifyEvent)
{
NotifyEvent("Has suscribers.");
}
}
}class MainClass
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
Subscriber subscriber = (Subscriber)Activator.GetObject(typeof(Subscriber),
"http://localhost:1000/Subscriber"); subscriber.Subscribe("123"); // ****** 运行到这里正常 Subscriber正确的打印了信息(123)
Issuer issuer = (Issuer)Activator.GetObject(typeof(Issuer), // ********* 方式一
"http://localhost:1080/Issuer"); // Issuer issuer = new Issuer(); // ********* 方式二 issuer.Happen(); // ****** 运行到这里也正常,Issuer 正确的打印了信息(Event happened.) if (subscriber != null && issuer != null)
{
// ****** 当使用方式一的时候, 下面这一句出错
issuer.NotifyEvent += new EventIssuer.RemoteObject.Issuer.Notify(subscriber.Subscribe); // ****** 当使用方式一的时候, 下面这一句不会被执行到。
// ****** 使用方式二的时候下面这句被正常执行
// ****** 并且,Issuer 正确的打印了信息(Event happened.)
// ****** Subscriber也 正确的打印了信息(Has suscribers.)。
issuer.Happen();
}
}
}
issuer.NotifyEvent += new EventIssuer.RemoteObject.Issuer.Notify(subscriber.Subscribe);
你用subscriber.Subscribe的方法就是为能让事件顺利被执行,所以subscriber的类是不用被注册的,只是用来做一个事件的中介,不用在服务端注册这个类,不然就不行了!!因为出于安全理由,客户端不用直接调用服务端的事件,必须中过中介类或另一个类的虚方法,再在客户端覆盖这个方法来实现!所以上面要改的
第一,不用在服务端注册Subscriber类
第二,Subscriber类中做一个调用Issuer类的事件,所以想真正调用到Issuer类的事件就必须在Subscriber添加一个事件,并在它的Subscribe方法中加入触发此事件的代码,再在客户也订阅一个Subscribe类的新增事件就可以顺序接收到Issuer类的事件了!
不太明白你的意思
因为你用Debug.WriteLine是试不出来的,请用Console.Writeln()吧!!
首先要明白一点,这是远程调用,也就是客户调用,服务器执行,也就是说执行Debug.WriteLine的是服务器端,不是客户端,你说能显示出Debug.WriteLine的代码,那时服务器是在Debug的吗?你是否是在客户端执行了Debug.WriteLine,如果是就不正确了!这样的话应该是服务器配置远程类时有问题!