将ClientCertificate应用于WCF DataService客户端时,如何解决此InvalidCastException问题? [英] How to solve this InvalidCastException while applying ClientCertificate to WCF DataService Client?

查看:121
本文介绍了将ClientCertificate应用于WCF DataService客户端时,如何解决此InvalidCastException问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已使用

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)

我通过反复试验来到了从SendingRequestSendingRequest2的修改,所以我想知道我是否忽略了那里的内容.还是这完全无关,我应该在处理程序的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆