Поддерживать сеанс при вызове веб-службы ASMX - PullRequest
6 голосов
/ 01 ноября 2011

Я использую клиентское приложение для подключения к веб-сервису только для аутентифицированного пользователя.Вот самый простой пример:
Код моего веб-сервиса:

public class TestService : System.Web.Services.WebService
{
    [WebMethod(EnableSession = true)]
    public string WelcomeMsg()
    {
        return "Hello: " + Session["UserName"] + "! Welcome to our store.";
    }

    [WebMethod(EnableSession = true)]
    public void SetUserName(string sName)
    {
        Session["UserName"] = sName;
    }
}

Вот мой код в клиентском приложении (форма Windows, а не веб-база):

private void btnSetName_Click(object sender, EventArgs e)
{
    TestService.TestService ws = new TestService.TestService(); //Create a web service
    MainForm.m_ccSessionInfo = new System.Net.CookieContainer(); //Create a CookieContainer
    ws.CookieContainer = MainForm.m_ccSessionInfo; //Set CookieContainer of the web service
    ws.SetUserName(txtUserName.Text); //Set value of session 
    ws = null;
}

private void btnWelcome_Click(object sender, EventArgs e)
{
    TestService.TestService ws = new TestService.TestService(); //Create a web service
    ws.CookieContainer = MainForm.m_ccSessionInfo; //Set CookieContainer back
    string sWelcome = ws.WelcomeMsg(); //Get value from session property
    ws = null;

    System.Diagnostics.Debug.WriteLine(sWelcome); 
}

В моем примереMainForm.m_ccSessionInfo является статическим членом, я хочу сохранить значение куки сессии в этом!
Однако это не работает :(. Функция ws.WelcomeMsg () всегда возвращает пустую строку.

Ответы [ 2 ]

8 голосов
/ 04 ноября 2011

Упс, думаю, я только что нашел решение этой проблемы.CookieContainer создается сервером и должен храниться в клиентском приложении.На btnSetName_Click я меняю

MainForm.m_ccSessionInfo = new System.Net.CookieContainer(); //Create a CookieContainer
ws.CookieContainer = MainForm.m_ccSessionInfo; //Set CookieContainer of the web service

на

ws.CookieContainer = new System.Net.CookieContainer(); //Create a CookieContainer
MainForm.m_ccSessionInfo = ws.CookieContainer; //Keep CookieContainer for later using

И теперь это работает хорошо!Спасибо вам всем.

1 голос
/ 01 ноября 2011

попробуйте ниже

private void btnWelcome_Click(object sender, EventArgs e)
{
    TestService.TestService ws = new TestService.TestService(); //Create a web service
    ws.SetUserName(txtUserName.Text); 
    string sWelcome = ws.WelcomeMsg();
    System.Diagnostics.Debug.WriteLine(sWelcome); 
}

При вызове метода btnSetName_Click и btnWelcome_Click щелкните веб-службы, поэтому ваши запросы будут рассматриваться как новые сеансы.

...