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 アプリケーション