Certificate 如何将证书附加到ODATA服务的C客户端?

Certificate 如何将证书附加到ODATA服务的C客户端?,certificate,odata,client-certificates,Certificate,Odata,Client Certificates,我们有一个ODATA服务,它使用证书进行保护。我们使用AddWebReference在C代码中获取代理 是否有方法将证书存储中的证书附加到此生成的代理类 我们可以使用HTTPClient添加证书,但我们希望避免使用HTTPClient与我们的ODATA服务对话,而更喜欢使用AddWebReference方法。我想这对您来说可能太晚了3年,但希望其他人能得到帮助 实际上非常详细地解释了需要什么 您需要将ClientCertificate属性添加到通过添加web引用生成的容器中并使用它。您可以通过创

我们有一个ODATA服务,它使用证书进行保护。我们使用AddWebReference在C代码中获取代理

是否有方法将证书存储中的证书附加到此生成的代理类


我们可以使用HTTPClient添加证书,但我们希望避免使用HTTPClient与我们的ODATA服务对话,而更喜欢使用AddWebReference方法。

我想这对您来说可能太晚了3年,但希望其他人能得到帮助

实际上非常详细地解释了需要什么

您需要将ClientCertificate属性添加到通过添加web引用生成的容器中并使用它。您可以通过创建一个分部类来添加以下行为:

公共部分类容器 { 私有X509CertificateClientCertificate=null; 公共X509证书客户端证书 { 收到 { 返回客户证书; } 设置 { 如果值==null { //如果事件之前已连接,我们应该将其删除 如果clientCertificate!=null this.SendingRequest-=this.OnSendingRequest\u AddCertificate; } 其他的 { //如果事件被设置为非null,则连接该事件 如果clientCertificate==null this.SendingRequest+=this.OnSendingRequest\u AddCertificate; } clientCertificate=值; } } 私有无效OnSendingRequest\u AddCertificateobject发送方,SendingRequestEventArgs args args { 如果为null!=客户端证书 { HttpWebRequestargs.Request.ClientCertificates.AddClientCertificate; } } } 在实例化的容器上,现在可以使用所需的证书设置ClientCertificate属性:

//获取证书所在的存储区。 var store=new x509storename.My,StoreLocation.LocalMachine; store.openflags.ReadOnly; //以任何方式从存储中选择您的证书。 X509Certificate2Collection certColl=store.Certificates.FindX509FindType.FindByThumbprint,您的指纹,false; //设置容器上的证书属性。 container.ClientCertificate=certColl[0]; 商店。关闭; WCF数据服务5+未完全工作 现在,如果您使用的是WCF Dataservice 5+,则SendingRequest事件已被弃用,如属性[ObsoleteSendingRequest2已被弃用以支持SendingRequest2.]所示,这不是我这边的一个输入错误。但是,我认为您仍然可以使用它,但是,如果您想使用SendingRequest2,您的部分请求应该如下所示:

公共部分类容器 { 私有X509CertificateClientCertificate=null; 公共X509证书客户端证书 { 收到 { 返回客户证书; } 设置 { 如果值==null { //如果事件之前已连接,我们应该将其删除 如果clientCertificate!=null this.SendingRequest2-=this.OnSendingRequest\u AddCertificate; } 其他的 { //如果事件被设置为非null,则连接该事件 如果clientCertificate==null this.SendingRequest2+=this.OnSendingRequest\u AddCertificate; } clientCertificate=值; } } SendingRequest\u AddCertificateobject发送方、SendingRequest2EventArgs参数上的私有无效 { 如果为null!=客户端证书 { HttpWebRequestMessageargs.RequestMessage.HttpWebRequest.ClientCertificates.AddClientCertificate; } } } 这对于通过试用和错误发现的非批处理请求很有效,因为我找不到很多关于SendingRequest和SendingRequest2之间差异的文档

但是,我现在似乎遇到了一些问题,args.RequestMessage的类型不是HttpWebRequestMessage,而是InvalidCastException。这就是我最终提出这个问题的原因。似乎只有批处理操作才会出错。InternalODataRequestMessage具有类型为ODataBatchOperationRequestMessage的私有成员requestMessage。它似乎没有任何可以添加客户端证书的属性


我已经发布了关于这个特定问题的帖子,如果我在这里提供的实现出现问题,我将更改此答案。

有人可以帮助我解决这个问题吗?