Sono interessato a impersonare servizi Web e Wcf noti per scopi di test di integrazione. A tal fine, vorrei acquisire i metadati del servizio, generare automaticamente gli stub del servizio e gli stub del servizio host in un ambiente ospitato autonomamente.Importazione dei metadati del servizio Web ASMX su Endpoint WCF
Seguendo this article here, sono in grado di ottenere metadati del servizio Wcf remoto e generare contratti. Tuttavia, sto avendo qualche difficoltà a fare lo stesso per i servizi Web Asmx remoti.
Ho un set di soluzioni mickey-mouse per verificarlo.
soluzione mio ASMX contiene il servizio di default "Ciao Mondo" web, che si trova al di sotto
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class SimpleAsmxService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld() { return "Hello World"; }
}
La mia soluzione Wcf contiene il servizio di default "Ciao Mondo", trovato anche sotto
[ServiceContract]
public interface ISimpleWcfService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
[DataContract]
public class CompositeType
{
[DataMember]
public bool BoolValue { get; set; }
[DataMember]
public string StringValue { get; set; }
}
public class SimpleWcfService : ISimpleWcfService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
Infine, la piccola console che potrebbe sembrare
class Program
{
public const string UrlWcf =
"http://localhost:8731/Design_Time_Addresses/SimpleWcfService/mex";
public const string UrlAsmx =
"http://localhost:1803/SimpleAsmxService.asmx?WSDL";
static void Main(string[] args)
{
EndpointAddress mexAddress = new EndpointAddress (UrlWcf);
MetadataExchangeClient mexClient =
new MetadataExchangeClient (mexAddress);
mexClient.ResolveMetadataReferences = true;
// NOTE: blows up if we use UrlAsmx
MetadataSet metaSet = mexClient.GetMetadata();
WsdlImporter importer = new WsdlImporter (metaSet);
Collection<ContractDescription> contracts =
importer.ImportAllContracts();
}
}
Mi sembra che dovrei essere in grado estrarre Wsdl da un noto Web Service Asmx e generare contratti [e da contratti a codice], ma non sembra contorcersi il campione precedente per farlo. Qualsiasi aiuto sarebbe molto apprezzato,
Grazie!
NOTA: l'errore generato quando si richiama MetadataSet metaSet = mexClient.GetMetadata();
sopra è un System.InvalidOperationException
con il messaggio di
metadati contengono un riferimento che non può essere risolto: 'http://localhost:1803/SimpleAsmxService.asmx?WSDL'
Con una System.InvalidOperationException
eccezione interna con messaggio di
<?xml version="1.0" encoding="utf-16"?>
<Fault xmlns="http://www.w3.org/2003/05/soap-envelope">
<Code>
<Value>Sender</Value>
</Code>
<Reason>
<Text xml:lang="en">
System.Web.Services.Protocols.SoapException: Unable to handle request without a valid action parameter. Please supply a valid soap action.
at System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest()
at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
</Text>
</Reason>
</Fault>
@johnny - Prego. ... Oh ragazzo! La mia primissima taglia! – Filburt