如何在将客户端应用程序应用于WCF DataService客户端时解决此无效的CastException



我使用了本文中的示例将客户端证书身份验证添加到我的WCF数据服务中。我必须稍微更改示例,因为我正在使用WCF DataService 5.6,其中SendingRequest事件已被弃用并用SendingRequest2替换。

基本上意味着更改以下事件处理程序:

private void OnSendingRequest_AddCertificate(object sender, SendingRequestEventArgs args)
{
    if (null != ClientCertificate)
    {
        ((HttpWebRequest)args.Request).ClientCertificates.Add(ClientCertificate);
    }
}

to:

private void OnSendingRequest_AddCertificate(object sender, SendingRequest2EventArgs args)
{
    if (null != ClientCertificate)
    {
        ((HttpWebRequestMessage)args.RequestMessage).HttpWebRequest.ClientCertificates.Add(ClientCertificate);
    }
}

这似乎有效。但是,现在我在某些操作上获得了以下InvalidCastException

system.invalidcastException:无法施放类型的对象 'System.Data.Services.Client.InternalOdatareQuestMessage'to类型 'system.data.services.client.httpwebrequestmessage'。

我无法通过100%精确识别这些操作是什么,但是在Savechanges方法上似乎一致(请参见下面的StackTrace:)

at MyNamespace.MyContainer.OnSendingRequest_AddCertificate(Object sender, SendingRequest2EventArgs args)
at System.Data.Services.Client.ODataRequestMessageWrapper.FireSendingRequest2(Descriptor descriptor)
at System.Data.Services.Client.BatchSaveResult.GenerateBatchRequest()
at System.Data.Services.Client.BatchSaveResult.BatchRequest()
at System.Data.Services.Client.DataServiceContext.SaveChanges(SaveChangesOptions options)

我通过反复试验从SendingRequestSendingRequest2进行了修改,所以我想知道我是否忽略了那里的东西。还是这完全无关,我应该在处理程序中的IF语句中添加&& args.RequestMessage is HttpWebRequestMessage吗?

似乎您正在发送批处理请求。批处理请求包含几个内部请求,这些请求是internalodatareQuestMessage。SendingRequest2将在$ batch请求和它的内部请求中应用OnsendingRequest诉讼。

您可以尝试以下代码

private void OnSendingRequest_AddCertificate(object sender, SendingRequest2EventArgs args)
{
    if (null != ClientCertificate && !args.IsBatchPart)
    {
        ((HttpWebRequestMessage)args.RequestMessage).HttpWebRequest.ClientCertificates.Add(ClientCertificate);
    }
}

args.isbatchpart如果此事件在批处理中发射为请求,则返回true,否则返回false。

看来,当我执行批处理操作时,问题就会发生。

我试图挖掘InternalODataRequestMessage,以查看是否可以使用反射和DataServices源以某种方式向其添加客户端证书。我发现InternalODataRequestMessage的实例具有ODataBatchOperationRequestMessage类型的私有成员requestMessage。通过查看源代码,我无法添加证书。

我确实注意到的是,我实际上仍然可以像以前一样使用弃用的SendingRequest事件。这就是我所做的,一切似乎都很好。

我觉得应该有一种使用客户证书而无需使用弃用方法的方法。因此,如果某人的答案表明,我会接受。

最新更新