3

WCF サービスから Web API アクションへの二重コールバックを受信しようとしています。しかし、どういうわけかこれは機能していません。Web API でコールバックを取得できません。

asp.net コア アプリケーションの代わりにコンソール アプリケーションを使用すると、コンソール アプリケーションはコールバックを受け取ります。したがって、WCF サービスは正しくセットアップされ、正常に動作しています。どういうわけか問題はWeb APIコントローラーにあります(特にコールバックハンドラーに関連しています)

Web API 内にコールバック ハンドラーを記述する方法を提案してください。

これらは私がこれまでに試した手順です-

手順 1: netTcpBinding を使用して WCF サービスを作成する

namespace WcfServiceLibrary1
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class CalculatorService : ICalculatorDuplex
    {
        double result;
        string equation;
        ICalculatorDuplexCallback callback = null;

        public CalculatorService()
        {
            result = 0.0D;
            equation = result.ToString();
            callback = OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
        }

        public void Clear()
        {
            callback.Equation(equation + " = " + result.ToString());
            result = 0.0D;
            equation = result.ToString();
            System.IO.File.AppendAllText(@"D:\Sanket\wcf_test.txt", DateTime.Now.ToShortTimeString() + "\t" + equation + "\t" + result + Environment.NewLine);
        }

        public void AddTo(double n)
        {
            result += n;
            equation += " + " + n.ToString();
            callback.Equals(result);
        }

        public void SubtractFrom(double n)
        {
            result -= n;
            equation += " - " + n.ToString();
            callback.Equals(result);
        }

        public void MultiplyBy(double n)
        {
            result *= n;
            equation += " * " + n.ToString();
            callback.Equals(result);
        }

        public void DivideBy(double n)
        {
            result /= n;
            equation += " / " + n.ToString();
            callback.Equals(result);
        }

    }

ステップ 2:この記事で説明されているように、WCF Connected Service 拡張機能を使用して、サービス参照コードを reference.cs という名前のファイルに生成します。

ステップ 3:ツールによって生成された WCF クライアント タイプのインスタンスを作成し、Web サービスと通信するために、Web API コントローラーに以下のコードを記述しました。

    [Produces("application/json")]
    [Route("api/[controller]")]
    public class WcfServiceTestingController : Controller
    {
        CalculatorDuplexClient wcfClient
            = new CalculatorDuplexClient(CalculatorDuplexClientBase.EndpointConfiguration.NetTcpBinding_ICalculatorDuplex);

        // GET: api/values
        [HttpGet]
        public ActionResult Get()
        {

            try
            {
                // Call the AddTo service operation.
                double value = 100.00D;
                wcfClient.AddToAsync(value);

                // Call the SubtractFrom service operation.
                value = 50.00D;
                wcfClient.SubtractFromAsync(value);

                // Call the MultiplyBy service operation.
                value = 17.65D;
                wcfClient.MultiplyByAsync(value);

                // Call the DivideBy service operation.
                value = 2.00D;
                wcfClient.DivideByAsync(value);

                // Complete equation.
                wcfClient.ClearAsync();

                // Wait for callback messages to complete before
                // closing.
                System.Threading.Thread.Sleep(5000);

                // Close the WCF client.
                wcfClient.Close();
                Console.WriteLine("Done!");
                return Json("Done!");
            }
            catch (TimeoutException timeProblem)
            {
                Console.WriteLine("The service operation timed out. " + timeProblem.Message);
                wcfClient.Abort();
                Console.Read();
                return Json("TimeoutException");
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                wcfClient.Abort();
                Console.Read();
                return Json("CommunicationException");
            }



        }

        private class CallbackHandler : ICalculatorDuplexCallback
        {
            public CallbackHandler()
            {
                Console.WriteLine("CallbackHandler");
            }

            public void Equals(double result)
            {
                Console.WriteLine(" Result({0})", result);
            }

            public void Equation(string eqn)
            {
                Console.WriteLine(" Equation({0})", eqn);
            }
        }
    }
}

私の環境:

Visual Studio 2015 Update3 + WCF Connected Service 拡張機能

netTcpBinding を使用した WCF サービス

ASP.NET コア 1.0 アプリケーション

4

0 に答える 0