Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在客户端的回调函数中调用其他WCF服务_C#_Wcf_Wcf Binding - Fatal编程技术网

C# 在客户端的回调函数中调用其他WCF服务

C# 在客户端的回调函数中调用其他WCF服务,c#,wcf,wcf-binding,C#,Wcf,Wcf Binding,我有一个带有回调接口的简单WCF应用程序。 我想要的是在客户端的回调函数中调用其他WCF服务 但当我尝试这样做时,我得到了一个例外 DetailsSystem.ServiceModel.CommunicationException:服务器未启动 提供有意义的答复;这可能是由合同引起的 不匹配、会话过早关闭或内部服务器错误 合同如下: [ServiceContract(CallbackContract = typeof(IMyServiceCallback))] public int

我有一个带有回调接口的简单WCF应用程序。 我想要的是在客户端的回调函数中调用其他WCF服务

但当我尝试这样做时,我得到了一个例外

DetailsSystem.ServiceModel.CommunicationException:服务器未启动 提供有意义的答复;这可能是由合同引起的 不匹配、会话过早关闭或内部服务器错误

合同如下:

   [ServiceContract(CallbackContract = typeof(IMyServiceCallback))]
    public interface IMyService
    {
        [OperationContract]
        void DoAddition(int numberOne, int numberTwo);

        [OperationContract]
        double Pow(double number, double power);
    }

    public interface IMyServiceCallback
   {
    [OperationContract]
    void OnCallback(string result);
   }
下面是简单的服务实现

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class MyCustomService : IMyService
    {
        public void DoAddition(int numberOne, int numberTwo)
        {
            Console.WriteLine("Now Do Addition called");

            var callback = OperationContext.Current.
            GetCallbackChannel<IMyServiceCallback>();

            callback.OnCallback("The result is="  + numberOne + numberTwo );
        }

        public double Pow(double number, double power)
        {
            double result = 0;
            try
            {
                Console.WriteLine("Now Pow called");
                result= Math.Pow(number, power);
            }
            catch (Exception e)
            {
               Console.WriteLine("Error:" + e);
            }

            return result;

        }
    }
在客户端,我想在回调函数中调用wcf服务,以便

[ServiceContract(CallbackContract = typeof(IMyServiceCallback))]
public class MyServiceCallback : IMyServiceCallback
    {
        public void OnCallback(string result)
        {
            Console.WriteLine("From Server I got the result" + result);
            Console.WriteLine(result);

            double powValue = Service.Pow(2, 3);

            Console.WriteLine("Power=" + powValue);
        }

        public IMyService Service { get; set; }
    }
我的客户代码是

var binding = new WSDualHttpBinding();
var address = new EndpointAddress(GetUri());

var callback = new MyServiceCallback();
var instanceContext = new InstanceContext(callback);

var factory = new DuplexChannelFactory<IMyService>(instanceContext, binding, address);
IMyService callService = factory.CreateChannel();
callback.Service = callService;

callService.DoAddition(4,6);

Console.ReadKey();
var binding=newwsdualhttpbinding();
var address=新的端点地址(GetUri());
var callback=new MyServiceCallback();
var instanceContext=newinstancecontext(回调);
var工厂=新的DuplexChannelFactory(instanceContext、binding、address);
IMyService callService=factory.CreateChannel();
callback.Service=callService;
callService.DoAddition(4,6);
Console.ReadKey();

我认为您缺少IMyServiceCallback接口的装饰。
您也可以更改您的运营合同吗?对不起,我忘了写信了。[已包含]实际上我的回调函数是由服务器OnCallBack调用的,我得到了结果,但当我尝试调用其他方法(如Pow)时,我得到了一个例外,然后我会将您的服务属性设置为静态。因此,您可以使用主服务通道。在这种情况下,必须对您的方法进行装饰[OperationContract(IsOneWay=true)]。这不是一个冗长的解决方案,但也不起作用。我使我在客户端的服务处于静态状态,并将[OperationContract(IsOneWay=true)]放在回调上,但仍然会遇到与Crash相同的错误。如果您尝试对服务进行更多修饰:)[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]PerSession,PerCall,Single…没有效果
var binding = new WSDualHttpBinding();
var address = new EndpointAddress(GetUri());

var callback = new MyServiceCallback();
var instanceContext = new InstanceContext(callback);

var factory = new DuplexChannelFactory<IMyService>(instanceContext, binding, address);
IMyService callService = factory.CreateChannel();
callback.Service = callService;

callService.DoAddition(4,6);

Console.ReadKey();