
Originariamente inviata da
mmjc23
Ciao sspintux
Ti dirò...io ho provato a dare un'occhiata al link che mi hai postato, ma non c'ho capito una mazza...
....
Alla fine, la botta di ( | )...da un post di un Forum che avevo già letto ma che non riuscivo ad utilizzare...
.......
Non mi rimane che capire come modificare l'app.config runtime in base a EndPoint e Username/Password letti da file config XML.
Ciao,
a me sembra che tu stia girando intorno al problema riuscendo ogni volta a creartene uno nuovo;
tra parentesi incomincio ad avere il sospetto che anche la deserializzazione a manina dell'errore sia inutile.
Non ho provato , ma questo è un custom binging che dovrebbe andare bene nel tuo caso
visto che usi https:
codice:
<bindings>
<customBinding>
<binding name="CustomSoapBinding">
<security includeTimestamp="false"
authenticationMode="UserNameOverTransport"
defaultAlgorithmSuite="Basic256"
requireDerivedKeys="false"
messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
</security>
<textMessageEncoding messageVersion="Soap11"></textMessageEncoding>
<httpsTransport />
</binding>
</customBinding>
</bindings>
username e password li imposti con un codice tipo questo :
codice:
var proxy = new ServiceRef.ServizioClient();
proxy.ClientCredentials.UserName.UserName = "user";
proxy.ClientCredentials.UserName.Password = "Password";
Non funzionerebbe con il protocollo http perché per impostazione predefinita WCF
non permette l'invio di username e password in chiaro senza una qualche forma di protezione,
motivo per cui ti avevo suggerito il punto 2) che funziona anche in questo caso e che , sempre senza aver provato e senza controllo errori, suona più o meno così:
codice:
using (var proxy = new ServiceRef.ServizioClient())
{
using (new OperationContextScope(proxy.InnerChannel))
{
string headerText =
"<wsse:UsernameToken xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"> " +
"<wsse:Username>{0}</wsse:Username> " +
"<wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">{1}</wsse:Password> " +
"</wsse:UsernameToken> ";
headerText = string.Format(headerText, "user", "pwd");
XmlDocument MyDoc = new XmlDocument();
MyDoc.LoadXml(headerText);
XmlElement myElement = MyDoc.DocumentElement;
System.ServiceModel.Channels.MessageHeader myHeader = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", myElement, true);
OperationContext.Current.OutgoingMessageHeaders.Add(myHeader);
....
}
Se non dovesse funzionare o se occorre un maggior controllo su come formare l'header di sicurezza
si può fare una cosa del genere :
codice:
using (var proxy = new ServiceRef.ServizioClient())
{
using (new OperationContextScope(proxy.InnerChannel))
{
var sh = new ClientSecurityHeader(utente, password);
OperationContext.Current.OutgoingMessageHeaders.Add(sh);
....
}
}
dove ClientSecurityHeader è una classe che eredita da MessageHeader
ed in cui puoi eseguire l'override dei suoi vari metodi :
OnWriteHeaderContent, OnWriteStrartHeader .... e compagnia bella.
.... infine, sicuro che non ti basti questo per risolvere alla radice
il problema della derializzazione dell'errore ?
codice:
// in pseudocodice
se il tipo della risposta ricevuto è errotype
'casta' la risosta in errortype
altrimenti
'castala' in ripostatype
HTH