Можно ли создавать сеансы (например, сеансы php) с C # WCF WebHttpBinding? - PullRequest
3 голосов
/ 03 июня 2010

Можно ли создавать сеансы с C # WCF WebHttpBinding? (Что-то вроде php-сессий с файлами cookie и т. Д.)

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

WCF поддерживает сеансы, однако требует привязки с некоторой безопасностью, эта ссылка должна объяснить:

http://social.msdn.microsoft.com/Forums/is/wcf/thread/7185e8b7-d4e5-4314-a513-ec590f26ffde

Вы можете реализовать менеджер сессий самостоятельно, некоторый статический класс, который поддерживает список сессий. Каждый сеанс может иметь «System.Timers.Timer», чтобы указать тайм-аут для сеанса, а затем подключить обработчик событий, который будет вызван по истечении таймера сеанса.

Когда это происходит, менеджер сеанса может утилизировать сеанс или если сеанс вызывается с использованием Guid (идентификатора сеанса) в качестве эталона, таймер может быть сброшен для поддержания сеанса живым.

С точки зрения cookie (который, скорее всего, будет идентификатором сеанса), вы можете использовать такие методы, чтобы получить и установить cookie в запросе:

    /// <summary>Gets a cookie value from cookies for given key.</summary>
    /// <param name="cookieKey">The key for the cookie value we require.</param>
    /// <returns>The cookie value.</returns>
    /// <exception cref="KeyNotFoundException">If the key was not found.</exception>
    private string GetCookieValue(string cookieKey)
    {
        string cookieHeader = WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.Cookie];
        string[] cookies = cookieHeader.Split(';');
        string result = string.Empty;
        bool cookieFound = false;

        foreach (string currentCookie in cookies)
        {
            string cookie = currentCookie.Trim();

            // Split the key/values out for each cookie.
            string[] cookieKeyValue = cookie.Split('=');

            // Compare the keys
            if (cookieKeyValue[0] == cookieKey)
            {
                result = cookieKeyValue[1];
                cookieFound = true;
                break;
            }
        }

        if (!cookieFound)
        {                
            string msg = string.Format("Unable to find cookie value for cookie key '{0}'", cookieKey);
            throw new KeyNotFoundException(msg);
        }

        // Note: The result may still be empty if there wasn't a value set for the cookie.
        // e.g. 'key=' rather than 'key=123'
        return result;
    }        

    /// <summary>Sets the cookie header.</summary>
    /// <param name="cookie">The cookie value to set.</param>
    private void SetCookie(string cookie)
    {
        // Set the cookie for all paths.
        cookie = cookie + "; path=/;" ;
        string currentHeaderValue = WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.SetCookie];

        if (!string.IsNullOrEmpty(currentHeaderValue))
        {
            WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.SetCookie]
                = currentHeaderValue + "\r\n" + cookie;
        }
        else
        {
            WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.SetCookie] = cookie;
        }
    }

Просто установите для cookie что-то вроде "sessionId = {myGuidHere}".

Надеюсь, это все равно поможет ... извините, я не могу опубликовать больше примеров кода, так как пишу его для клиента.

peteski

1 голос
/ 08 июня 2011

Если вы просто хотите работать с файлами cookie, WebHttpBinding уже имеет такую ​​возможность , но по умолчанию она отключена. Я не знаком с тем, что предоставляют другие возможности PHP-сессий, но поскольку WebHttpBinding построен поверх бессессионного шаблона HTTP-запроса / ответа, вам придется развернуть свой собственный, как @ peteski22 наброски в его ответе.

...