【问题标题】:Call other WCF service inside the callback function at client side在客户端的回调函数中调用其他 WCF 服务
【发布时间】:2018-09-30 14:30:13
【问题描述】:

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

但是当我尝试做时,我得到了异常

DetailsS​​ystem.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;

        }
    }

我将它作为服务托管在控制台中

callServiceHost = new ServiceHost(typeof(MyService.MyCustomService));
callServiceHost.AddServiceEndpoint(typeof (IMyService), new WSDualHttpBinding(), new Uri(GetUri()));
callServiceHost.Open();
Console.WriteLine("Press  to terminate.\n\n");
Console.ReadLine();

在客户端,我想在回调函数中调用 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();

【问题讨论】:

    标签: c# wcf wcf-binding


    【解决方案1】:

    我认为您的 IMyServiceCallback 接口缺少[ServiceContract] 装饰。 还有能不能换个运营合同[OperationContract(IsOneWay = true)]

    【讨论】:

    • 对不起,我只是忘记写了。 [已经包含] 实际上我的回调函数是由服务器 OnCallBack 调用的,我得到了结果,但是当我尝试调用 Pow 等其他方法时,我得到了那个异常
    • 那么我会将您的服务属性设置为静态。这样您就可以使用主要服务渠道。在这种情况下,必须对方法进行装饰 [OperationContract(IsOneWay = true)]。
    • 不是一个优雅的解决方案,但它也不起作用。我在客户端使我的服务静态并将 [OperationContract(IsOneWay = true)] 放在 CallBack 上,但仍然遇到相同的崩溃错误
    • 你可以尝试对你的服务进行更多的装饰:)[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    • PerSession,PerCall,Single ...无效
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多