Я использую контейнер IOC, который предоставляет мне IService. В случае, когда IService является службой WCF, она предоставляется фабрикой каналов. Когда IService находится на том же компьютере, он может получить доступ к одним и тем же файлам cookie, поэтому нет проблем, однако после вызова службы WCF необходимо отправить эти файлы cookie.
Я потратил много времени, пытаясь найти способ отправки файлов cookie с помощью фабрики каналов, и единственный способ, который я смог найти, - это следующий
var cookie = _authenticationClient.GetHttpCookie();
HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, cookie.Name + "=" + cookie.Value);
using(var scope = new OperationContextScope((IClientChannel)_service))
{
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
var result = _service.Add(details);
if (result.Result == RPGResult.Success)
{
return RedirectToAction("Index", "Home", result.Id);
}
}
Проблема со мной, использующим этот метод, заключается в том, что я должен знать, что вызываю службу WCF, что не всегда так. Я пытался написать оболочку для ChannelFactory, которая открывает новую область контекста операции при создании новой службы и различных других решений, но ничего не сработало.
У кого-нибудь есть опыт отправки файлов cookie через службы WCF?
Я нашел решение, связанное с использованием SilverLight, к сожалению, я не использую Silverlight, решение здесь: http://greenicicleblog.com/2009/10/27/using-the-silverlight-httpclient-in-wcf-and-still-passing-cookies/ К сожалению, стандартный .net не содержит интерфейса IHttpCookieContainerManager
В идеале я мог бы использовать что-то подобное, т.е. Я мог бы указать фабрике каналов передавать файл cookie всякий раз, когда он открывается.
Если у кого-то есть лучший способ передать токен, который используется для аутентификации, это тоже будет оценено.