0

コールバック インターフェイスを備えた単純な 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();
4

1 に答える 1

0

[ServiceContract]IMyServiceCallback インターフェイスによる装飾が欠けていると思います。また、運用契約も変更できますか[OperationContract(IsOneWay = true)]

于 2013-11-14T08:53:12.650 に答える