2010-01-21 19 views
6

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&amp; abortProcessing) 
     </Text> 
    </Reason> 
</Fault> 
+0

@johnny - Prego. ... Oh ragazzo! La mia primissima taglia! – Filburt

risposta

6

Il modo per farlo funzionare con un servizio web ASMX è specificare il MetadataExchangeClientMode

... 
MetadataExchangeClient mexClient = 
    new MetadataExchangeClient (new Uri(), MetadataExchangeClientMode.HttpGet); 
... 

utilizzando MetadataExchangeClientMode. HttpGet per i servizi ASMX e MetadataExchangeClientMode. MetadataExchange per i servizi WCF.

+0

@Filburt, muchos gracias! –

Problemi correlati