2010-01-21 6 views
6

통합 테스트 목적으로 잘 알려진 웹 서비스 및 Wcf 서비스를 가장하려고합니다. 이를 위해 자체 호스팅 환경에서 서비스 메타 데이터를 캡처하고 서비스 스텁을 자동 생성하며 서비스 스텁을 호스트하고자합니다.WCF 끝점에 ASMX 웹 서비스 메타 데이터 가져 오기

this article here에 이어 원격 Wcf 서비스 메타 데이터를 가져 와서 계약을 생성 할 수 있습니다. 그러나 원격 Asmx 웹 서비스에서 동일한 작업을 수행하는 데 어려움을 겪고 있습니다.

저는 이것을 조사하기위한 일련의 미키 마우스 솔루션을 보유하고 있습니다.

내 ASMX 솔루션 내 WCF 솔루션은 또한 마지막으로

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

아래에있는 기본 "안녕하세요"서비스를 포함

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

아래에있는 기본에 "Hello World"웹 서비스를 포함, 작은 콘솔 그 모양은

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 웹 서비스에서 Wsdl을 가져오고 계약을 생성하고 계약을 코드로 작성하지만 앞의 샘플을 그렇게 할 수는 없습니다. 어떤 도움을 많이 주시면 감사하겠습니다.

Thanks!


NOTE 'http://localhost:1803/SimpleAsmxService.asmx?WSDL'

을 A의 :

메타 데이터의 메시지와 함께 System.InvalidOperationException는 해결할 수없는 참조를 포함 상기 MetadataSet metaSet = mexClient.GetMetadata();를 호출 한 경우에 발생하는 에러가 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

답변

6

그것이 ASMX 웹 서비스와 함께 작동하도록하는 방법은 MetadataExchangeClientMode를 사용하여 MetadataExchangeClientMode

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

을 지정하는 것입니다. ASMX 서비스 용 HttpGetMetadataExchangeClientMode. WCF 서비스 용 MetadataExchange.

+0

@ Filburt, muchos gracias! –

관련 문제