如何让wcf服务保持ajax调用之间的数据?
问题描述:
假设我有简单的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调用之间保持数据的最佳做法是什么?
答
嗯,我找到了答案。似乎最好的办法是为我的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;
}
}
引入数据库? – 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