2010-01-21 15 views
6

Estoy interesado en suplantar a servicios web bien conocidos y servicios Wcf para realizar pruebas de integración. Para este fin, me gustaría capturar los metadatos del servicio, generar autos de servicio y los trozos de servicio de host en un entorno autohospedado.Importación de metadatos del servicio web ASMX al WCF Endpoint

Siguiendo this article here, puedo obtener metadatos remotos del servicio Wcf y generar contratos. Sin embargo, tengo algunas dificultades para hacer lo mismo con los servicios web remotos de Asmx.

Tengo un conjunto de soluciones de mickey mouse para investigar esto.

solución Mi asmx contiene un defecto "Hello World" servicio web, que se encuentra a continuación

[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"; } 
} 

Mi solución WCF contiene el servicio es un defecto "Hello World", también se encuentra por debajo de

[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; 
    } 
} 

Por último, la pequeña consola que se parece a

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(); 
    } 
} 

Me parece que debería poder para extraer Wsdl de un servicio web Asmx conocido y generar contratos [y de contratos a código], pero parece que no puede contorsionar la muestra anterior para hacerlo. Cualquier ayuda sería muy apreciada,

¡Gracias!


NOTA: el error generado cuando se invoca MetadataSet metaSet = mexClient.GetMetadata(); anterior es una System.InvalidOperationException con el mensaje de

de metadatos contiene una referencia que no se puede resolver: 'http://localhost:1803/SimpleAsmxService.asmx?WSDL'

Con una System.InvalidOperationException excepción interna con mensaje de

<?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 - De nada. ... ¡Oh chico! ¡Mi primera recompensa! – Filburt

Respuesta

6

La manera de conseguir que funcione con un servicio web ASMX es especificar el MetadataExchangeClientMode

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

usando MetadataExchangeClientMode. HttpGet para sus servicios ASMX y MetadataExchangeClientMode. MetadataExchange para sus servicios de WCF.

+0

@Filburt, muchos gracias! –

Cuestiones relacionadas