我已经完成了wcf服务,发布了(我可以通过浏览器连接到它,我可以看到wsdl)但是当我尝试通过我编写的客户端程序来使用它时,我获得了一个“验证消息“message。”的安全性时发生错误。
一些细节:消费者和服务器在同一台机器上(所以这不是消费者和服务器之间不同步时间的情况),我使用自签名证书,该服务放在一个小节中一个更好的解决方案,它有一个专用的web.config来覆盖解决方案。
Web服务端的Web.config文件在消费者方面都是相同的(我只是从服务到消费者文件进行了复制和粘贴)。 Consumer使用basicHttpBinding和TransportWithMessageCredential连接,经过多次尝试,即使我已经通过Visual Studio工具创建了对服务的服务引用,在使用者代码中我再次指定绑定类型而不是端点地址。
正如我已经说过的,该服务使用自签名证书,我已经实现了验证类来验证不可信证书。
当我在我的消费者类中创建代理对象时,我没有收到任何错误,只有当我尝试在我的服务上使用任何方法时才收到它。我已经设置了tracelog,但它似乎没有显示任何错误,因为我能理解:
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>262165</EventID>
<Type>3</Type>
<SubType Name="Information">0</SubType>
<Level>8</Level>
<TimeCreated SystemTime="2014-10-30T10:41:32.4017455Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{43c6480e-e3fe-4916-b3a3-efaa10881db5}" />
<Execution ProcessName="w3wp" ProcessID="7004" ThreadID="6" />
<Channel />
<Computer>WKR1007R</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Information">
<TraceIdentifier>http://msdn.microsoft.com/it-IT/library/System.ServiceModel.Channels.RequestChannelReplyReceived.aspx</TraceIdentifier>
<Description>Ricevuta risposta tramite il canale di richiesta</Description>
<AppDomain>/LM/W3SVC/1/ROOT/PBEWS_Client_Test-1-130591392918713557</AppDomain>
<Source>System.ServiceModel.Channels.BufferedMessage/2733477</Source>
<ExtendedData xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/MessageTraceRecord">
<MessageProperties>
<Encoder>text/xml; charset=utf-8</Encoder>
<AllowOutputBatching>False</AllowOutputBatching>
<Security>
<IsAnonymous>False</IsAnonymous>
<WindowsIdentityUsed>False</WindowsIdentityUsed>
</Security>
</MessageProperties>
<MessageHeaders></MessageHeaders>
</ExtendedData>
</TraceRecord>
</DataItem>
</TraceData>
只使用Fiddler我会发现错误:
Errore服务器nell'applicazione'/ PBEWS_Client_Test'。
Errore durante la verifica della sicurezza del messaggio。
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente。 Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice,vedere la traccia dello stack。
<b> Dettagli eccezione: </b>System.ServiceModel.FaultException: Errore durante la verifica della sicurezza del messaggio.<br><br>
<b>Errore nel codice sorgente:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code><pre>
里加584:
Riga 585:public R ... Contracts.PolPolizza RecuperaPolizza(int idPolizza,bool modalita){
Riga 586:return base.Channel.RecuperaPolizza(idPolizza,modalita);
里加587:}
里加588:
</td>
</tr>
</table>
<br>
<b> File di origine: </b> c:\..\PBEWS_Client_Test\Service References\ServiceReference1\Reference.cs<b> Riga: </b> 586
<br><br>
<b>Traccia dello stack:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
[FaultException: Errore durante la verifica della sicurezza del messaggio.]
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)+14799942 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp; msgData,Int32 type)+622 PBEWS_Client_Test.ServiceReference1.PBEWS.RecuperaPolizza(Int32 idPolizza,Boolean modalita)+0 cE中的PBEWS_Client_Test.ServiceReference1.PBEWSClient.RecuperaPolizza(Int32 idPolizza,Boolean modalita):... \ PBEWS_Client_Test \ Service References \ ServiceReference1 \ Reference.cs:586 c中的PBEWS_Client_Test.PBEWS_TestForm.Button1_Click(Object sender,EventArgs e):... \ PBEWS_Client_Test \ PBEWS_TestForm.aspx.cs:103 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)+155 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+3804
</td>
</tr>
</table>
它表示“验证消息的安全性时发生错误”并引用Reference.cs,即Visual Studio工具在设置服务引用时创建的文件。从577到590的行包含以下代码:
public PBEWS_Client_Test.ServiceReference1.MRAnaAnagraficaBaseList RicercaAnagrafiche(System.Collections.Generic.List<Rgi.PassBroker.WCF.Contracts.CriterioRicercaWS> criteri) {
return base.Channel.RicercaAnagrafiche(criteri);
}
public System.Threading.Tasks.Task<PBEWS_Client_Test.ServiceReference1.MRAnaAnagraficaBaseList> RicercaAnagraficheAsync(System.Collections.Generic.List<Rgi.PassBroker.WCF.Contracts.CriterioRicercaWS> criteri) {
return base.Channel.RicercaAnagraficheAsync(criteri);
}
public Rgi.PassBroker.WCF.Contracts.PolPolizza RecuperaPolizza(int idPolizza, bool modalita) {
return base.Channel.RecuperaPolizza(idPolizza, modalita);
}
public System.Threading.Tasks.Task<Rgi.PassBroker.WCF.Contracts.PolPolizza> RecuperaPolizzaAsync(int idPolizza, bool modalita) {
return base.Channel.RecuperaPolizzaAsync(idPolizza, modalita);
}