是否可以使用C#WCF WebHttpBinding创建会话? (类似于带有cookie等的php会话)
答案 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概述。