2010-10-02 78 views
2

我有一个MVC2应用程序。基本上,在我的Bill视图中,我希望用户单击“Request Bill”并调用WCF服务。该服务然后返回一个回叫的欠款。我有两个问题。调用WCF双工服务的ASP.NET MVC2应用程序

  1. 来自客户端的双工方法回调不会执行或不会被调用。这是发生在一起的。有时会被调用,有时不会
  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>&nbsp;</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"); 
     } 
    } 

任何想法?

+0

1+好描述 – Aliostad 2010-10-02 15:46:26

+0

你使用哪种绑定? HTTP还是TCP?目前为 – Aliostad 2010-10-02 15:49:27

+0

,netTcpBinding。我也试过用wsDualHttpBinding - 发生同样的行为 – Mage 2010-10-02 16:37:57

回答

2

这是竞争条件和双工服务的错误使用。

在你的代码会发生什么:

  • 你有一个控制器,它调用服务操作
  • 服务操作开始新的线程,并返回
  • 你的控制器继续处理并返回的ViewResult
  • 在平均时间工作线程服务进程代码并开始回调
  • 现在,如果工作人员足够快,您的回调称为
  • 如果工人不够快,你的看法是已经呈现,并从计算的更改将丢失
  • 此外,如果工人实在是太慢了控制器从内存和代理以及= >回调不能被称为这可能导致异常获释服务

只是不要在Web应用程序中使用双工服务。这是没有意义的,因为你仍然需要等待回调 - 我没有看到用请求/响应模式调用服务和调用计算作为常用方法的不同之处。

+0

如果我想让用户点击Request Bill并继续工作,然后在账单准备好可以查看时得到通知,该怎么办?所以双面打印不在Web应用中使用,常用的是什么? – Mage 2010-10-02 18:02:03

+0

在这种情况下,您需要AJAX – 2010-10-02 18:10:52

+0

对服务进行ajax调用仍会导致相同的行为。浏览器在需要调用回调函数时关闭 – Mage 2010-10-08 03:20:48

相关问题