1

从自动生成的 Web 服务代理类调用方法时出现以下错误:

System.ServiceModel.Security.MessageSecurityException 未处理
HResult=-2146233087 Message=HTTP 请求被客户端身份验证方案“匿名”禁止。源=mscorlib
ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System。 Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: System.Net.WebException HResult=-2146233079 Message=远程服务器返回错误:(403) 禁止。Source=System StackTrace:位于 System.ServiceModel.Channels.HttpChannelFactory'1 的 System.Net.HttpWebRequest.GetResponse()。

这是如何称呼它

X509Certificate2 x509Certificate = new X509Certificate2();
X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection = ((X509Certificate2Collection)store.Certificates).Find(X509FindType.FindByTimeValid, DateTime.Now, false);
X509Certificate2Collection collection1 = X509Certificate2UI.SelectFromCollection(collection, "Certificados disponiveis", "Selecione o certificado", X509SelectionFlag.SingleSelection);
x509Certificate = collection1[0];

LoteNFeSoapClient loteNFe = new LoteNFeSoapClient();
loteNFe.ClientCredentials.ClientCertificate.SetCertificate(x509Certificate.Subject, StoreLocation.CurrentUser, StoreName.My);
Retorno.Text = loteNFe.TesteEnvioLoteRPS(1, Assinado.Text);

我如何添加此 Web 服务参考:

在 MS Visual Studio 2013 社区中,Project > Add > Service Reference

服务参考窗口

服务参考高级设置窗口

Obs:这些是默认配置。这是一个市政网络服务,用于发送所提供的运输或物流服务的电子发票。

我读过添加证书所必需的地方,例如:

LoteNFeSoapClient loteNFe = new LoteNFeSoapClient();
loteNFe.ClientCertificates.Add(clientCertificate);

但这是不可能的,因为:

  1. 这个自动生成的 web 服务类不会继承自具有这种方法的ClientCertificates.Add()HttpWebClientProtocol,例如类。
  2. LoteNFeSoapClient()类已经从一个接口继承,该接口使消息契约匹配请求和响应之间的值。
  3. 在 C# 中,一个类不能有多个基类。

那么,可以做些什么呢?提前致谢。

4

1 回答 1

0

解决了,我刚刚使用wsdl.exe通过命令行生成了webservice代理类,这个类现在继承自System.Web.Services.Protocols.SoapHttpClientProtocol,所以我可以使用添加证书

LoteNFe loteNFe = new LoteNFe();
loteNFe.ClientCertificates.Add(x509Certificate);

注意:通过命令行生成的类与使用 VS2013 UI 生成的类完全不同。

于 2017-04-02T19:56:02.937 回答