2010-01-21 64 views
6

我有意冒充衆所周知的Web服務和WCF服務進行集成測試。爲此,我想捕獲服務元數據,自動生成服務存根,並在自託管環境中託管服務存根。將ASMX Web服務元數據導入到WCF端點

以下this article here,我能夠獲得遠程Wcf服務元數據並生成合同。但是,對於遠程的Asmx Web服務,我也遇到了一些困難。

我有一套用於審覈的mickey-mouse解決方案。

我ASMX解決方案包含一個默認的 「Hello World」 Web服務,發現下面

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

我的WCF解決方案包含一個默認的 「Hello World」 的服務,還發現以下

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

最後,小控制檯,可能看起來像

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

在我看來,我應該能夠從知名的Asmx Web服務中拉取Wsdl並生成合同[以及從合同到代碼],但似乎無法扭轉前面的示例。任何幫助將不勝感激,

謝謝!


注:以上調用MetadataSet metaSet = mexClient.GetMetadata();時所產生的誤差是

元數據的消息的System.InvalidOperationException包含無法解析的引用: 'http://localhost:1803/SimpleAsmxService.asmx?WSDL'

隨着System.InvalidOperationException內部例外消息

<?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 - 不客氣。 ... 好傢伙!我的第一個賞金! – Filburt 2010-02-22 22:12:55

回答

6

讓它與ASMX Web服務的工作方式是指定使用MetadataExchangeClientModeMetadataExchangeClientMode

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

HttpGet爲您的ASMX服務 和MetadataExchangeClientModeMetadataExchange爲您的WCF服務。

+0

@Filburt,muchos gracias! – 2010-02-22 15:00:59