2011-04-23 105 views
1

假設我有簡單的WCF服務:如何讓wcf服務保持ajax調用之間的數據?

[ServiceContract] 
public interface ITestService 
{ 
    [OperationContract] 
    [WebInvoke(
     Method = "POST", 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     ResponseFormat = WebMessageFormat.Json)] 
    string GetStatus(); 

    [OperationContract] 
    [WebInvoke(
     Method = "POST", 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     ResponseFormat = WebMessageFormat.Json)] 
    string SetStatus(string status);  
} 

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class TestService : ITestService 
{ 
    private string _status; 
    public string GetStatus() 
    { 
     return _status; 
    } 
    public string SetStatus(string status) 
    { 
     _status = status; 
     return "completed"; 
    } 
} 

和執行兩個AJAX調用該服務的Html頁面:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Wcf services test</title> 
    <script type="text/javascript" src="Scripts/jquery-1.5.1.min.js"></script> 
    <script language="javascript" type="text/javascript"> 
     function btnSend_onclick() { 
      $.ajax({ 
       type: "POST", 
       contentType: "application/json; charset=utf-8", 
       url: "Services/TestService.svc/SetStatus", 
       data:'{"status":"'+jQuery("#txtSetStatus").val()+'"}', 
       processData: false, 
       dataType: "json", 
       //If the call succeeds 
       success: 
     function (response) { 
       jQuery("#lblInfo").text('Service returned: ' + response.SetStatusResult); 
     }, 
       //If the call fails 
       error: function (XMLHttpRequest, textStatus, errorThrown) { 
        jQuery("#lblInfo").text(XMLHttpRequest.responseText); 
       } 
      }); 

     } 
     function btnGetStatus_onclick() { 
      $.ajax({ 
       type: "POST", 
       contentType: "application/json; charset=utf-8", 
       url: "Services/TestService.svc/GetStatus", 
       processData: false, 
       dataType: "json", 
       //If the call succeeds 
       success: 
     function (response) { 
      jQuery("#lblGetStatus").text('Status is: ' + response.GetStatusResult); 
     }, 
       //If the call fails 
       error: function (XMLHttpRequest, textStatus, errorThrown) { 
        jQuery("#lblInfo").text(XMLHttpRequest.responseText); 
       } 
      }); 

     } 

    </script> 
</head> 
<body> 
<input type="text" id="txtSetStatus" /> 
<button id="btnSend" onclick="return btnSend_onclick()">Send status</button> 
<span id="lblStatus"></span> 
<span id="lblInfo"></span> 
<br /> 
<button id="btnGetStatus" onclick="return btnGetStatus_onclick()">Get Current Status</button> 
<span id="lblGetStatus"></span> 
</body> 
</html> 

如果我調用SetStatus第一(通過鍵入txtSetStatus輸入的東西,單擊Send status按鈕),然後調用GetStatus(通過單擊Get Current Status按鈕),然後返回的狀態爲null。我知道發生這種情況是因爲WCF服務實例每次在html頁面執行ajax請求時都會創建。 但在兩個或更多的ajax調用之間保持數據的最佳做法是什麼?

+1

引入數據庫? – 2011-04-23 13:39:20

+2

最好的做法是讓服務狀態更少=存儲服務之外的狀態,例如在數據庫中。 – 2011-04-23 13:42:32

+0

不幸的是,數據庫在我正在處理的場景中不起作用。真實世界的場景是頁面對WCF服務執行POST請求(發送一些數據),然後頁面打開新的窗口,其URL = GET請求到WCF服務。這個請求響應的內容(type =「application/pdf」)取決於第一個請求發送的數據。所以這些數據真的需要存儲在2個調用之間,並且之後不需要保存。我不認爲數據庫是這種情況的很好的解決方案。 – sovo2011 2011-04-23 14:50:52

回答

0

嗯,我找到了答案。似乎最好的辦法是爲我的WCF服務設置aspNetCompatibilityEnabled = true,然後利用asp.net Session對象爲了暫時保留這些值:

public class TestService : ITestService 
{ 
    public string GetStatus(string id) 
    { 
     var session = System.Web.HttpContext.Current.Session; 
     var ret= session[id].ToString(); 
     session.Remove(id); 
     return ret; 
    } 
    public string SetStatus(string status) 
    { 
     var guid = Guid.NewGuid().ToString("D"); 
     var session = System.Web.HttpContext.Current.Session; 
     session.Add(guid, status); 
     return guid; 
    } 
}