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調用之間保持數據的最佳做法是什麼?
引入數據庫? – 2011-04-23 13:39:20
最好的做法是讓服務狀態更少=存儲服務之外的狀態,例如在數據庫中。 – 2011-04-23 13:42:32
不幸的是,數據庫在我正在處理的場景中不起作用。真實世界的場景是頁面對WCF服務執行POST請求(發送一些數據),然後頁面打開新的窗口,其URL = GET請求到WCF服務。這個請求響應的內容(type =「application/pdf」)取決於第一個請求發送的數據。所以這些數據真的需要存儲在2個調用之間,並且之後不需要保存。我不認爲數據庫是這種情況的很好的解決方案。 – sovo2011 2011-04-23 14:50:52