我使用了本文中的示例将客户端证书身份验证添加到我的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)
我通过反复试验从SendingRequest
到SendingRequest2
进行了修改,所以我想知道我是否忽略了那里的东西。还是这完全无关,我应该在处理程序中的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
事件。这就是我所做的,一切似乎都很好。
我觉得应该有一种使用客户证书而无需使用弃用方法的方法。因此,如果某人的答案表明,我会接受。