.net 如何访问WCF数据服务客户端中的WebResponse,以便使用其中包含的cookies?

.net 如何访问WCF数据服务客户端中的WebResponse,以便使用其中包含的cookies?,.net,authentication,wcf-data-services,odata,.net,Authentication,Wcf Data Services,Odata,我正在编写一个调用WCF数据服务的.NET应用程序,该服务要求在HTTP头中传递身份验证凭据。我正在DataServiceContext.SendingRequest事件处理程序中设置该标头。然后,服务在cookie中返回身份验证令牌。客户端应在后续调用中提供此cookie。我可以在SendingRequest事件中设置cookie,但我无法找到一种方法来钩住响应,以便首先获得cookie。(为什么没有DataServiceContext.ResponseReceived事件?) 感谢您提供的任

我正在编写一个调用WCF数据服务的.NET应用程序,该服务要求在HTTP头中传递身份验证凭据。我正在DataServiceContext.SendingRequest事件处理程序中设置该标头。然后,服务在cookie中返回身份验证令牌。客户端应在后续调用中提供此cookie。我可以在SendingRequest事件中设置cookie,但我无法找到一种方法来钩住响应,以便首先获得cookie。(为什么没有DataServiceContext.ResponseReceived事件?)

感谢您提供的任何见解或指导


Dave

不完全清楚您需要在何处访问cookie值,但您应该能够通过在服务的构造函数中连接事件处理程序连接到处理管道,例如:

public ScratchService()
{
    ProcessingPipeline.ProcessingRequest += (source, e) =>
        {
            WebHeaderCollection headers = e.OperationContext.RequestHeaders;
            string acceptHeader = headers["CustomCookie"];
            if (acceptHeader == null || !acceptHeader.Equals("Passw0rd"))
            {
                throw new DataServiceException(403, "You had a bad cookie.");
            }
        };
}

ProcessingRequest在调用管道的其余部分之前发生,因此这应该是您进行身份验证的合理位置。显然,您需要比上述示例更安全的东西。:)

我想不出通过事件处理程序实现这一点的方法。但是你可以通过操作响应找到它。例如,如果通过运行Execute调用查询,它将返回从OperationResponse派生的实例(http://msdn.microsoft.com/en-us/library/system.data.services.client.operationresponse.aspx). 这将公开响应头。保存更改等也是如此。

Mark,谢谢您的回复。然而,我需要的是客户端。我需要在DataServiceContext发出WebRequest后访问客户端上接收的WebResponse。类似于DataServiceContext.SendingRequest的东西,但用于响应而不是请求。谢谢,Vitek。这很有效。它似乎有点脆弱,因为DataServiceQuery.Execute没有文档化以返回OperationResponse,但我认为它是不需要更改服务器端代码的最佳选择。我很欣赏这个答案。我认为文档中有一个bug,它完全支持并保证返回操作响应(实际上,执行将返回QueRealOffice响应)。这真的很好知道!如果将其写入合同中,甚至比文档记录更好。Execute的静态返回类型是IEnumerable。如果我们要依赖于从OperationResponse派生的运行时类型,那么理想情况下Execute的返回类型将类似于OperationResponse(我意识到它不存在),这反过来将被定义为实现IEnumerable。再次感谢你的回答。这正是我要找的,我没想到会找到它。实际的返回类型是QueryOperationResponse,它确实派生自IEnumerable。我真的不知道为什么该方法被声明为返回IEnumerable。不幸的是,我不确定是否有可能解决这个问题,这可能是一个突破性的改变。它可能不是一个突破性的改变。现有客户端依赖于IEnumerable返回类型。因为QueryOperationResponse实现了IEnumerable,所以如果将返回类型更改为QueryOperationResponse,那么当前客户机不应该感到麻烦。但我不知道这样的改变是否需要消费者重新编译。