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