У меня есть приложение MVC2.По сути, в моем представлении «Билл» я хочу, чтобы пользователь нажал «Запросить счет», и он вызывает службу WCF.Затем служба возвращает обратный вызов с причитающейся суммой.У меня 2 проблемы.
- Обратный вызов метода дуплексного режима от клиента не выполняется или не вызывается.Это происходит периодически.Иногда он вызывается, а иногда нет
- Вторая проблема заключается в том, что независимо от того, выполняется метод обратного вызова или нет, страница или приложение закрываются вскоре (в течение 2-3 секунд) после возврата представления.
На мой взгляд, у меня есть следующее:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Bill
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Bill Summary:</h2>
<td>
<%: ViewData["ProcessingMessage"] %>
</td>
<table>
<tr>
<th>
Username:
</th>
<th>
Total Number of Calls:
</th>
<th>
Amount to be Paid:
</th>
<th> </th>
</tr>
<td>
<%: ViewData["Username"] %>
</td>
<td>
<%: ViewData["CallsCount"] %>
</td>
<td>
<%: ViewData["TotalAmount"] %>
</td>
</table>
</asp:Content>
В моем контроллере у меня есть следующий метод:
public class TelephoneController : Controller
{
BillingCallback proxy = new BillingCallback();
public ActionResult Bill()
{
ViewData["ProcessingMessage"] = "Processing Request.....";
proxy.CallService(User.Identity.Name);
return View();
}
}
Я создал класс для обратного вызова:
public class BillController : Controller
{
private const double amountPerCall = 0.25;
public double calcBill()
{
double total = amountPerCall;
Log p = new Log();
return total;
}
public ActionResult Index()
{
return View();
}
}
Теперь к услуге:
[ServiceContract(CallbackContract = typeof(IBillCallBack))]
public interface IBill
{
[OperationContract(IsOneWay = true)]
void GetBilling(string username);
}
public interface IBillCallBack
{
[OperationContract(IsOneWay = true)]
void CalculateBilling(string message);
}
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]
class Bill : IBill
{
public void GetBilling(string username)
{
IBillCallBack callback = OperationContext.Current.GetCallbackChannel<IBillCallBack>();
ThreadPool.QueueUserWorkItem(new WaitCallback(SendOperationToClient), callback);
}
public void SendOperationToClient(object stateinfo)
{
IBillCallBack callback;
callback = stateinfo as IBillCallBack;
string s = Thread.CurrentThread.ManagedThreadId.ToString();
callback.CalculateBilling("username");
}
}
Есть идеи?