首先,我承认我是WCF的新手。仍未走出训练轮。
我被分配开发WCF服务,部分要求是需要将每个请求作为HTTP cookie传递一种“会话令牌”。 (可以预见,此类令牌需要在此类服务中成功“登录”调用的HTTP响应头中生成。)
这是直截了当的吗?
答案 0 :(得分:2)
免责声明:您实际上并不应该这样做,因为它迫使WCF服务充当Web服务。但如果您需要cookie,请继续阅读。
如果您只需要会话ID,则可以从以下网址获取:
OperationContext.Current.SessionId
如果你需要cookie,你需要跳过一些箍。它的要点是(1)设置asp.net兼容性,(2)引用HttpContext.Current属性。
您的服务需要使用wsHttpBinding(或其他支持会话的绑定)。如果将项目创建为IIS中托管的WCF服务,则默认情况下会获得这些服务。您还需要在配置文件中设置asp.net兼容性。
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<bindings>
<wsHttpBinding>
<binding name="MyBinding" allowCookies="false" ... </binding>
</wsHttpBinding>
</bindings>
(请参阅链接here了解为什么我有allowCookies = false)
要启用会话,请在WCF服务合同上设置以下内容
[ServiceContract(SessionMode=SessionMode.Required)]
public interface IMyWcfService {...}
您可能还想在服务本身上设置ServiceBehavior(PerSession是默认值),您需要设置asp.net兼容性。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]
public class MyWcfService : IMyWcfService {...}
您可以访问的一些相关属性:
// Gives you the current session id as a string
HttpContext.Current.Session.SessionID
// Indicates whether the service is using sessionless cookies
HttpContext.Current.Session.CookieMode
// Indicates whether the session id is stored in the url or in an HTTP cookie
HttpContext.Current.Session.IsCookieless
// The cookies themselves
HttpContext.Current.Request.Cookies
HttpContext.Current.Response.Cookies
// The session and cache objects
HttpContext.Current.Cache
HttpContext.Current.Session
WCF服务中会话的链接:
http://msdn.microsoft.com/en-us/library/ms733040.aspx
HTH,
詹姆斯
答案 1 :(得分:0)
msdn上的这个主题可以帮助你http://msdn.microsoft.com/en-us/library/bb398778.aspx。
此外,这可以帮助您在IIS中托管您的WCF服务:http://msdn.microsoft.com/en-us/library/aa702682.aspx 和http://msdn.microsoft.com/en-us/library/bb332338.aspx(使用互联网信息服务托管)
答案 2 :(得分:0)
这只是部分地回答了你的问题,但是会给你一个启动配置。 在服务配置部分下的配置文件中,创建基本的http绑定:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="myHttpBinding" allowCookies="true">
</binding>
</basicHttpBinding>
</system.serviceModel>
然后阅读wcf绑定和端点配置。