Как заставить службу wcf хранить данные между вызовами ajax? - PullRequest
1 голос
/ 23 апреля 2011

Предположим, у меня есть простой сервис WCF:

[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";
    }
}

и HTML-страница, которая выполняет два вызова ajax для этой службы:

<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 и нажав кнопку «Отправить состояние»), затем вызову GetStatus (нажав кнопку «Получить текущее состояние»), тогда возвращенное состояние будет нулевым. Я понимаю, что это происходит потому, что экземпляр службы WCF создается каждый раз, когда HTML-страница выполняет запрос AJAX. Но как лучше хранить данные между 2 и более вызовами ajax?

1 Ответ

0 голосов
/ 24 апреля 2011

Ну, я нашел ответ.Кажется, что лучший способ - установить aspNetCompatibilityEnabled = true для моей службы WCF, а затем использовать объект сеанса asp.net для временного хранения значений:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...