Wcf Duplex协定GetCallbackChannel始终返回空实例

Wcf Duplex协定GetCallbackChannel始终返回空实例,wcf,callback,nullreferenceexception,Wcf,Callback,Nullreferenceexception,以下是服务器代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.Runtime.Serialization; using System.ServiceModel.Description; namespace Console_Chat {

以下是服务器代码:

    using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
   using System.ServiceModel;
  using System.Runtime.Serialization;
  using System.ServiceModel.Description;



   namespace Console_Chat
{


    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IMyCallbackContract))]
    public interface IMyService
    {
        [OperationContract(IsOneWay = true)]
        void NewMessageToServer(string msg);

        [OperationContract(IsOneWay = false)]
        bool ServerIsResponsible();

    }



    [ServiceContract]
    public interface IMyCallbackContract
    {
        [OperationContract(IsOneWay = true)]
        void NewMessageToClient(string msg);

        [OperationContract(IsOneWay = true)]
        void ClientIsResponsible();



    }


    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class MyService : IMyService
    {

       public IMyCallbackContract callback = null;

    /*
    {
            get
            {
                return OperationContext.Current.GetCallbackChannel<IMyCallbackContract>();
            }
        }
      */  

        public MyService()
        {
            callback = OperationContext.Current.GetCallbackChannel<IMyCallbackContract>();
        }

        public void NewMessageToServer(string msg)

        {
            Console.WriteLine(msg);
        }

        public void NewMessageToClient( string msg)
        {

            callback.NewMessageToClient(msg);
        }


        public bool ServerIsResponsible()
        {
            return true;
        }

    }




    class Server
    {
        static void Main(string[] args)
        {
            String msg = "none";


            ServiceMetadataBehavior behavior = new
            ServiceMetadataBehavior();


            ServiceHost serviceHost = new
            ServiceHost(
            typeof(MyService),
            new Uri("http://localhost:8080/"));

            serviceHost.Description.Behaviors.Add(behavior);

            serviceHost.AddServiceEndpoint(
                typeof(IMetadataExchange),
                MetadataExchangeBindings.CreateMexHttpBinding(),
                "mex");


            serviceHost.AddServiceEndpoint(
                typeof(IMyService),
                new WSDualHttpBinding(),
                "ServiceEndpoint"
                );

            serviceHost.Open();
            Console.WriteLine("Server is up and running");

            MyService server = new MyService();
            server.NewMessageToClient("Hey client!");
/*

             do
            {
                msg = Console.ReadLine();

               // callback.NewMessageToClient(msg);


            } while (msg != "ex");

  */
            Console.ReadLine();     

        }
    }
}
callback=OperationContext.Current.GetCallbackChannel(); 这一行不断抛出一个NullReferenceException,有什么问题吗


谢谢

您不能只使用回调协定启动WCF服务,然后立即尝试执行客户端回调。目前还没有客户

在代码中,我看到您手动实例化
MyService
,并尝试执行回调方法。这根本行不通。如果要使用
GetCallbackChannel
方法,则必须在实际存在通道时执行此操作,即在远程WCF客户端调用的实际操作的上下文中。否则,没有当前的
OperationContext
,您将得到一个空引用异常,因为
OperationContext.current
返回
null

回调用于长时间运行的服务操作。例如:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService
{
    // One-way method
    public void PerformLongRunningOperation()
    {
        var callback = 
            OperationContext.Current.GetCallbackChannel<IMyCallbackContract>();
        var result = DoLotsOfWork();
        callback.LongRunningOperationFinished(result);
    }
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
公共类MyService:IMyService
{
//单向法
public void performlonglunningoperation()
{
变量回调=
OperationContext.Current.GetCallbackChannel();
var result=DoLotsOfWork();
callback.LongRunningOperationFinished(结果);
}
}
要测试这一点,您必须实际创建一个客户端-启动一个新项目,添加对此服务的引用,实现导入程序生成的回调,使用回调创建一个
InstanceContext
,使用该
InstanceContext
创建客户端代理,最后调用它的
performlonglunningoperation
方法


如果您正试图开发一个发布/订阅实现,其中客户端实际上并不启动操作,而只是注册自己以接收一些回调,请查看此页面:。

您不能仅使用回调契约启动WCF服务,然后立即尝试执行客户端回调。目前还没有客户

在代码中,我看到您手动实例化
MyService
,并尝试执行回调方法。这根本行不通。如果要使用
GetCallbackChannel
方法,则必须在实际存在通道时执行此操作,即在远程WCF客户端调用的实际操作的上下文中。否则,没有当前的
OperationContext
,您将得到一个空引用异常,因为
OperationContext.current
返回
null

回调用于长时间运行的服务操作。例如:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService
{
    // One-way method
    public void PerformLongRunningOperation()
    {
        var callback = 
            OperationContext.Current.GetCallbackChannel<IMyCallbackContract>();
        var result = DoLotsOfWork();
        callback.LongRunningOperationFinished(result);
    }
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
公共类MyService:IMyService
{
//单向法
public void performlonglunningoperation()
{
变量回调=
OperationContext.Current.GetCallbackChannel();
var result=DoLotsOfWork();
callback.LongRunningOperationFinished(结果);
}
}
要测试这一点,您必须实际创建一个客户端-启动一个新项目,添加对此服务的引用,实现导入程序生成的回调,使用回调创建一个
InstanceContext
,使用该
InstanceContext
创建客户端代理,最后调用它的
performlonglunningoperation
方法


如果您正试图开发一个发布/订阅实现,其中客户端实际上并不启动操作,而只是注册自己以接收一些回调,请查看以下页面:。

Start,也许可以。此链接建议使用多个具有工作链接的网站来了解更多关于酒吧/酒吧的信息。伙计们,我无法神奇地恢复该网站。使用回程机器:也许开始吧。此链接建议使用多个具有工作链接的网站来了解更多关于酒吧/酒吧的信息。伙计们,我无法神奇地恢复该网站。使用回程机器: