1

我使用一个为我提供 IService 的 IOC 容器。在 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 编写一个包装器,它在创建新服务和各种其他解决方案时打开一个新的 operationcontextscope,但没有任何效果。

有人有通过 WCF 服务发送 cookie 的经验吗?

我找到了一个涉及使用 SilverLight 的解决方案,不幸的是我没有使用 silverlight,解决方案在这里: http: //greenicicleblog.com/2009/10/27/using-the-silverlight-httpclient-in-wcf-and-still -passing-cookies/ 不幸的是标准 .net 不包含 IHttpCookieContainerManager 接口

理想情况下,我可以使用类似的东西,即我可以告诉 channelfactory 在它打开时传递一个 cookie。

如果有人有更好的方法来传递用于身份验证的令牌,那也将不胜感激。

4

1 回答 1

0

我有一个解决方案,我创建了一个 IService 的代理类,然后每次调用 IService 上的方法时,它都会调用由通道工厂创建的代理,但调用本身被包装在一个 operationcontextscope 中,就像我在我的问题中遇到的那样。我从这个链接http://www.codeproject.com/KB/cs/dynamicproxy.aspx使用了代理工厂

于 2010-10-24T14:26:15.020 回答