Est-il possible de créer des sessions avec C# WCF WebHttpBinding? (Quelque chose comme des séances comme php avec les cookies, etc.)Est-il possible de créer des sessions (comme des sessions php) avec C# WCF WebHttpBinding?
Répondre
WCF prend en charge les sessions, mais il nécessite une fixation avec une certaine sécurité, ce lien devrait expliquer:
http://social.msdn.microsoft.com/Forums/is/wcf/thread/7185e8b7-d4e5-4314-a513-ec590f26ffde
Vous pouvez mettre en œuvre un gestionnaire de session vous , une classe statique qui maintient une liste de sessions. Chaque session peut avoir un 'System.Timers.Timer' pour spécifier un délai d'attente pour la session, puis connecter un gestionnaire d'événement à appeler lorsque le délai de session expire. Lorsque cela se produit, le gestionnaire de session peut disposer de la session, ou si la session est appelée en utilisant un Guid (l'ID de session) comme référence, le minuteur peut être réinitialisé en gardant la session en vie.
En ce qui concerne le cookie (qui serait probablement l'ID de session), vous pouvez utiliser des méthodes comme celles-ci pour obtenir et définir le cookie dans la demande:
/// <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;
}
}
Il suffit de régler le cookie à quelque chose comme " sessionId = {myGuidHere} ".
J'espère que cela aide de toute façon .. désolé, je ne peux pas poster plus d'exemple de code que je l'écris pour un client.
peteski
Si vous voulez juste travailler avec les cookies, le WebHttpBinding déjà has that capability mais il est désactivé par défaut. Je ne suis pas familier avec les autres fonctionnalités que les sessions PHP fournissent, mais puisque WebHttpBinding est construit sur le modèle de requête/réponse HTTP sans session, vous devrez faire rouler vos propres croquis @ peteski22 dans sa réponse.
Est-ce que ça ne répond pas à la question? :( – peteski