我有一个远程客户端使用的WCF服务。出于安全原因,客户端设置为发送带有一些用户数据的标头。在服务方面,我有一个实现 IDispatchMessageInspector 的类。
在类中(在 AfterReceiveRequest 方法中)我正在检查每个收到的消息,如果用户数据有效 - 如果它无效(或丢失)则抛出异常。但是,当客户端尝试引用或更新服务时,也会触发此操作 - 该服务将其视为常规soap消息。由于此消息不包含必要的标题,因此失败。
我做了以下黑客来解决这个问题:
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
MessageHeaders headers = request.Headers;
int index = headers.FindHeader(HEADER_NAME, NAMESPACE);
if (index < 0)
{
// skip verification and log-in if the caller is the MetadataExchangeService
if (headers.To.AbsoluteUri.EndsWith("mex"))
{
return null;
}
throw new SecurityException(string.Format("WCF message contains no header with name '{0}' and namespace '{1}'.", HEADER_NAME, NAMESPACE));
}
// rest of code.....
}
所以我的问题是 - 是否有更聪明的方法来检查来电是否来自Mex?或者 AfterReceiveRequest 可能不是进行此用户验证的最佳位置?