2010-01-21 30 views
6

Tôi quan tâm đến việc mạo danh Dịch vụ web nổi tiếng và Dịch vụ Wcf cho mục đích kiểm tra tích hợp. Để đạt được mục đích này, tôi muốn thu thập siêu dữ liệu dịch vụ, tự động tạo các sơ đồ dịch vụ và các sơ đồ dịch vụ lưu trữ trong môi trường tự lưu trữ.Nhập siêu dữ liệu Dịch vụ web ASMX vào WCF Endpoint

Sau this article here, tôi có thể nhận siêu dữ liệu Dịch vụ Wcf từ xa và tạo hợp đồng. Tuy nhiên, tôi đang gặp một số khó khăn khi thực hiện tương tự cho các dịch vụ Web Asmx từ xa.

Tôi có một bộ giải pháp mickey-mouse để thực hiện điều này.

Giải pháp của tôi Asmx chứa một mặc định "Hello World" dịch vụ web, tìm thấy dưới đây

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

giải pháp WCF My chứa một mặc định dịch vụ "Hello World", cũng tìm thấy dưới đây

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

Cuối cùng, bàn điều khiển nhỏ có thể trông giống như

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

Dường như với tôi rằng tôi sẽ có thể để kéo Wsdl từ một Dịch vụ Web Asmx nổi tiếng và tạo các hợp đồng [và từ các hợp đồng tới mã], nhưng dường như không thể bóp méo mẫu trước đó để làm như vậy. Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao,

Cảm ơn!


LƯU Ý: lỗi phát sinh khi gọi MetadataSet metaSet = mexClient.GetMetadata(); trên là một System.InvalidOperationException với thông điệp của

Metadata chứa một tham chiếu mà không thể được giải quyết: 'http://localhost:1803/SimpleAsmxService.asmx?WSDL'

Với một System.InvalidOperationException ngoại lệ bên trong với thông báo

<?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 - Bạn được chào đón. ... Oh Boy! Tiền thưởng đầu tiên của tôi! – Filburt

Trả lời

6

Cách để có được nó để làm việc với một dịch vụ web ASMX là để xác định MetadataExchangeClientMode

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

sử dụng MetadataExchangeClientMode. HttpGet cho các dịch vụ ASMX của bạn và MetadataExchangeClientMode. MetadataExchange cho các dịch vụ WCF của bạn.

+0

@Filburt, nhiều gracias! –

Các vấn đề liên quan