将ClientCertificate应用于WCF DataService客户端时,如何解决此InvalidCastException问题? [英] How to solve this InvalidCastException while applying ClientCertificate to WCF DataService Client?
问题描述
I have used the examples in this article to add client certificate authentication to my WCF Data Service. I had to change the example slightly because I am using WCF DataService 5.6 in which the SendingRequest
event has been deprecated and replaced by SendingRequest2
.
基本上,这意味着更改以下事件处理程序:
Basically this meant changing the following event handler:
private void OnSendingRequest_AddCertificate(object sender, SendingRequestEventArgs args)
{
if (null != ClientCertificate)
{
((HttpWebRequest)args.Request).ClientCertificates.Add(ClientCertificate);
}
}
收件人:
private void OnSendingRequest_AddCertificate(object sender, SendingRequest2EventArgs args)
{
if (null != ClientCertificate)
{
((HttpWebRequestMessage)args.RequestMessage).HttpWebRequest.ClientCertificates.Add(ClientCertificate);
}
}
这似乎有效.但是,现在我在某些操作上得到以下InvalidCastException
:
This seems to work. However now I get the following InvalidCastException
on some actions:
System.InvalidCastException:无法转换类型的对象 键入"System.Data.Services.Client.InternalODataRequestMessage" "System.Data.Services.Client.HttpWebRequestMessage".
System.InvalidCastException: Unable to cast object of type 'System.Data.Services.Client.InternalODataRequestMessage' to type 'System.Data.Services.Client.HttpWebRequestMessage'.
我无法100%准确地确定这些动作是什么,但是在SaveChanges方法上似乎始终如一(请参见下面的stacktrace:)
I haven't been able to identify with 100% accuracy which actions these are, but it seems consistently on the SaveChanges method (see stacktrace below:)
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
吗?
I came to the modification from SendingRequest
to SendingRequest2
by trial and error, so I wonder if I overlooked something there. Or is this completely unrelated and should I just add an && args.RequestMessage is HttpWebRequestMessage
to the if statement in the handler?
推荐答案
似乎您正在发送批处理请求.批处理请求包含几个内部请求,这些内部请求是InternalODataRequestMessage. SendingRequest2会将OnSendingRequest操作应用于$ batch请求及其内部请求.
Seems that you are sending a batch request. A batch request contains several internal requests which are InternalODataRequestMessage. SendingRequest2 will apply the OnSendingRequest action into both the $batch request and it's internal requests.
您可以尝试使用以下代码
You can try following code
private void OnSendingRequest_AddCertificate(object sender, SendingRequest2EventArgs args)
{
if (null != ClientCertificate && !args.IsBatchPart)
{
((HttpWebRequestMessage)args.RequestMessage).HttpWebRequest.ClientCertificates.Add(ClientCertificate);
}
}
args.IsBatchPart如果在批处理中针对请求触发了此事件,则返回true,否则返回false.
args.IsBatchPart returns true if this event is fired for request within a batch, otherwise returns false.
这篇关于将ClientCertificate应用于WCF DataService客户端时,如何解决此InvalidCastException问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!