0

我正在编写一个调用 WCF 数据服务的 .NET 应用程序,该服务需要在 HTTP 标头中传递身份验证凭据。我在 DataServiceContext.SendingRequest 事件处理程序中设置该标头。然后该服务在 cookie 中返回一个身份验证令牌。客户端应在后续调用中提供此 cookie。我可以在 SendingRequest 事件中设置 cookie,但我一直无法找到一种方法来挂钩响应以便首先获取 cookie。(为什么没有 DataServiceContext.ResponseReceived 事件?)谁能告诉我(1)如何挂钩响应以便我可以读取 HttpWebResponse.Cookies 集合,或者(2)如何配置 WCF 数据服务客户端管道自动处理cookies?

感谢您的任何见解或方向!

戴夫

4

2 回答 2

1

我想不出一种通过事件处理程序来做到这一点的方法。但是您可以通过 OperationResponse 获得它。例如,如果您通过运行 Execute 调用查询,它会返回一个派生自 OperationResponse (http://msdn.microsoft.com/en-us/library/system.data.services.client.operationresponse.aspx) 的实例。这会暴露响应标头。SaveChanges 等也是如此。

于 2012-08-02T15:45:04.673 回答
0

尚不清楚您需要在哪里访问 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 在调用管道的其余部分之前发生,因此这应该是您进行身份验证的合理位置。显然,您需要比上面的示例更安全的东西。:)

于 2012-08-01T22:16:59.550 回答