2012-06-19 2 views
9

매우 도움이되지 않는 방식으로 작성된 wsdl 파일이 있습니다. 어떤 경우에는 크기가 수 메가 바이트입니다. 크기가 크고 다양한 Visual Studio 도구를 사용하여 래퍼를 생성하면 결과 코드베이스가 너무 커서 약한 컴퓨터에서 Visual Studio가 손상되는 경향이 있습니다. 컴파일 시간은 우스꽝스럽고 결과 클래스는보다 동적 인 액세스 모드 (즉, 일종의 인덱서)가 필요한 곳에서 속성을 사용합니다. 서버 측에서는 변경 사항이 없습니다.다른 인터페이스를 사용하여 웹 서비스 사용하기

wsdl 파일은 손으로 처리 할 수있는 것보다 훨씬 크기가 크며 임의의 수입니다. 지금까지 사용해온 솔루션은 결과 또는 자동 생성 클래스에 반영 또는 지연 바인딩을 사용하는 것입니다. 그러나 여기에 래퍼를 다루고 있기 때문에입니다. 기본적으로 SOAP 메시지의 클라이언트는 다른 방법이 있다면 의미가 있습니다.

필자는 특히 필드가 관련된 경우보다 동적 인 인터페이스를 제공하는 래퍼를 만들고 싶습니다. 이 작업은 완전히 직관적 인 것이 아니므로해야 할 일에 대한 제안, 다양한 클래스, 사용자 정의 가능한 코드 생성기, WSDL 탐색기/파서 등이 필요하므로 작업 시간을 단축 할 수 있습니다. 내 자신의 SOAP 클라이언트를 구성해야합니까? 나는 그것을 기반으로 무엇을 할 것인가? .NET 기능이이 작업을 도와 줄 수 있습니까?

+2

왜 wsdl이 그렇게 큰지 물어볼 수 있습니까? – Paparazzi

+0

그것은 톤과 톤의 필드/속성을 가지고 있습니다. – GregRos

답변

9

WebService에서 사용할 수있는 메소드의 서브 세트를 지원하는 인터페이스를 생성하고 서비스 참조 생성 필요성을 제거 할 수 있습니다.

dto 및 네임 스페이스를 포함한 메소드에 올바른 비누 서명을 만들어야합니다. 이 단점은 서비스 변경을 수동으로 관리해야한다는 것입니다.

다음은 IServiceInterface을 노출하는 서비스와의 통신으로 ISubsetInterface으로 생성 된 프록시 클라이언트를 보여주는 간단한 예입니다. 이를 달성하기 위해 Name 속성은 IServiceInterface 계약의 이름과 일치해야합니다.이 경우 기본값은 "IServiceInterface"이지만 구현시 네임 스페이스 및 동작을 조작해야 할 수 있습니다. 조작 할 필요가있는 것을 아는 가장 간단한 방법은 생성 된 wsdl을 보는 것입니다.

[TestFixture] 
public class When_using_a_subset_of_a_WCF_interface 
{ 
    [Test] 
    public void Should_call_interesting_method() 
    { 
     var serviceHost = new ServiceHost(typeof(Service)); 

     serviceHost.AddServiceEndpoint(typeof(IServiceInterface), new BasicHttpBinding(), "http://localhost:8081/Service"); 
     serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true; 

     serviceHost.Open(); 

     using(var channelFactory = new ChannelFactory<ISubsetInterface>(new BasicHttpBinding(), "http://localhost:8081/Service")) 
     { 
      var client = channelFactory.CreateChannel(); 

      client.InterestingMethod().Should().Be("foo"); 
     } 

     serviceHost.Close(); 
    } 

    [ServiceContract] 
    interface IServiceInterface 
    { 
     [OperationContract] 
     string InterestingMethod(); 
     [OperationContract] 
     string UninterestingMethod(); 
    } 

    [ServiceContract(Name = "IServiceInterface")] 
    interface ISubsetInterface 
    { 
     [OperationContract] 
     string InterestingMethod(); 
    } 

    class Service : IServiceInterface 
    { 
     public string InterestingMethod() { return "foo"; } 

     public string UninterestingMethod() { throw new NotImplementedException(); } 
    } 
} 
2

DataContracts을 포함하는 공유 어셈블리를 사용하는 것이 좋습니다.

그런 다음 ChannelFactory<T> 클래스를 사용하여 서버 인터페이스의 인스턴스를 만듭니다. 그런 다음 WSDL 없이도 서버를 호출 할 수 있습니다.

관련 문제