是否可以使用C#WCF WebHttpBinding创建会话(如php会话)?

时间:2010-06-03 13:32:24

标签: c# wcf session cookies webhttpbinding

是否可以使用C#WCF WebHttpBinding创建会话? (类似于带有cookie等的php会话)

2 个答案:

答案 0 :(得分:4)

WCF支持会话,但它需要具有一定安全性的绑定,此链接应解释:

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

您可以自己实现会话管理器,一些维护会话列表的静态类。每个会话都可以有一个'System.Timers.Timer'来指定会话的超时,然后挂钩一个事件处理程序,以便在会话计时器到期时调用。

当发生这种情况时,会话管理器可以处理会话,或者如果使用Guid(会话ID)作为参考调用会话,则可以重置计时器,使会话保持活动状态。

就cookie而言(很可能是会话ID),你可以使用这些方法在请求中获取和设置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 :(得分:1)

如果您只想使用Cookie,WebHttpBinding已经has that capability,但默认情况下已关闭。我不熟悉PHP会话提供的其他功能,但由于WebHttpBinding是建立在无会话HTTP请求/响应模式之上的,因此你必须在他的答案中将自己作为@peteski22概述。