Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在将ClientCertificate应用于WCF DataService客户端时解决此InvalidCastException?_Wcf_Odata_Wcf Data Services_Client Certificates - Fatal编程技术网

如何在将ClientCertificate应用于WCF DataService客户端时解决此InvalidCastException?

如何在将ClientCertificate应用于WCF DataService客户端时解决此InvalidCastException?,wcf,odata,wcf-data-services,client-certificates,Wcf,Odata,Wcf Data Services,Client Certificates,我已使用中的示例将客户端证书身份验证添加到我的WCF数据服务中。我不得不稍微更改这个示例,因为我使用的是WCF DataService 5.6,其中的SendingRequest事件已被弃用,并被SendingRequest2取代 基本上,这意味着更改以下事件处理程序: private void OnSendingRequest_AddCertificate(object sender, SendingRequestEventArgs args) { if (null != Client

我已使用中的示例将客户端证书身份验证添加到我的WCF数据服务中。我不得不稍微更改这个示例,因为我使用的是WCF DataService 5.6,其中的
SendingRequest
事件已被弃用,并被
SendingRequest2
取代

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

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

这似乎奏效了。但是,现在我在一些操作中得到以下
InvalidCastException

System.InvalidCastException:无法强制转换类型为的对象 “System.Data.Services.Client.InternalODataRequestMessage”以键入 “System.Data.Services.Client.HttpWebRequestMessage”

我无法100%准确地确定这些操作是什么,但似乎在SaveChanges方法上是一致的(请参见下面的stacktrace:)


通过反复试验,我将
SendingRequest
修改为
SendingRequest2
,因此我想知道我是否忽略了其中的一些内容。或者这是完全不相关的,我是否应该在处理程序中的if语句中添加一个
&&args.RequestMessage is HttpWebRequestMessage

当我执行批处理操作时,似乎出现了问题

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

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


我觉得应该有一种方法可以在不使用不推荐的方法的情况下使用客户端证书。因此,如果有人的回答显示了这一点,我会接受。

似乎您正在发送一个批处理请求。批处理请求包含多个内部请求,它们是InternalODataRequestMessage。SendingRequest2将OnSendingRequest操作应用于$batch请求及其内部请求

您可以尝试以下代码

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

args.IsBatchPart如果为批处理中的请求触发此事件,则返回true,否则返回false。

因此,您的意思是批处理操作请求包装多个请求,并且该事件也为每个包含请求的请求触发。我始终理解批处理操作是一个描述多个操作的请求。我已经有一段时间没有写这段代码了。我不确定我是否有机会很快测试一下。当我有,我会检查回来的结果。无论如何谢谢你!
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)
private void OnSendingRequest_AddCertificate(object sender, SendingRequest2EventArgs args)
{
    if (null != ClientCertificate && !args.IsBatchPart)
    {
        ((HttpWebRequestMessage)args.RequestMessage).HttpWebRequest.ClientCertificates.Add(ClientCertificate);
    }
}