2011-04-19 61 views
0

我使用.Net MVC應用程序作爲簡化的Web服務。返回一個HttpWebResponse ASP.Net MVC

我有一個異步方法,我稱之爲:

public void RunQueue() 
    { 
     QueueDelegate queue = new QueueDelegate(Queue); 
     AsyncCallback completedCallback = new AsyncCallback(QueueCompleteCallback); 

     lock (_sync) 
     { 
      if (!queueIsRunning) 
      { 
       AsyncOperation async = AsyncOperationManager.CreateOperation(null); 
       queue.BeginInvoke(QueueCompleteCallback, async); 
       queueIsRunning = true; 
      } 
     } 
    } 

和希望的是,當我叫它,它開始的隊列,然後讓用戶繼續使用他們的日子(他們會當隊列完成時收到一封電子郵件)。

現在看來,一切正常,除了不讓用戶繼續,調用「Web服務」的網頁只是掛起,並且請求最終超時。

如何構建HttpWebResponse並將其發送回其他服務器以便用戶可以繼續?

我試過讓它返回「void」以外的東西,但是這並沒有太大的作用。

下面是調用它的控制器。

public ActionResult StartQueue() 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:2394/Home/RunQueue/"); 
     HttpWebResponse response; 
     string r = ""; 
     try 
     { 
      response = (HttpWebResponse)request.GetResponse(); 
      Stream stream = response.GetResponseStream(); 

      StreamReader reader = new StreamReader(stream); 
      r = reader.ReadToEnd(); 
     } 
     catch (WebException ex) // A WebException is not fatal. Record the status code. 
     { 
      response = (HttpWebResponse)ex.Response; 
      if (response != null) // timeout 
      { 
       r = response.StatusCode.ToString(); 
      } 
     } 
     ViewData["message"] = r; 
     return View(); 
    } 
+1

那麼你的控制器/動作是什麼樣子? – 2011-04-19 12:39:40

+0

就目前來看,這是Home控制器的動作中(一旦我得到它會改變,我會增加安全性) 另一方面,我有一個網頁製作一個簡單的GET HttpWebRequest到上面的動作地址,並等待一個我希望能夠發回像「Queue Started」這樣的消息,可以顯示給用戶。 – andrewheins 2011-04-19 12:47:46

+0

請顯示它。 – 2011-04-19 12:48:42

回答

0

什麼是QueueDelegate類?我的猜測是,該請求正在等待其他線程完成(也許像Thread.Join()?)。我不認爲發送響應是你想要的解決方案 - 我建議或者找到一種方法來產生一個與當前請求斷開連接的線程,以便自然結束,或者將邏輯完全移出到Windows服務。

託管你的長期運行的進程在網絡背景下將是複雜充其量:(