2010-06-10 5 views
1

나는 간단한 웹 서비스를 실행하고 있으며 콘솔 애플리케이션 클라이언트가 서비스를 사용하고있다. 이 문제가 생겨서이 커뮤니티에서 멋진 사람들이 도움을 받았다.WCF 웹 서비스 사용하기

나는 루프에서 클라이언트의 서비스를 호출하려는 경우 작동하지 않는 또 다른 문제가 있습니다. 그것은 처음으로 작동하고 그 후에 다만 기다리는 것을 계속한다. 왜 이런 일이 일어나고 어떻게 해결할 수 있습니까?

코드 :

namespace WebService 
{ 
    [ServiceContract] 
    public interface IService 
    { 
    [OperationContract(Name="Result")] 
    [WebGet(UriTemplate = "/")] 
    Stream Result(); 
    } 

    public class Service:IService 
    { 
     public Stream Result() 
     { 
      // read a file from the server and return it as stream 
     } 
    } 
} 

The client: 
namespace WebServiceClient 
{ 
    [ServiceContract] 
    public interface IService 
    { 
    [OperationContract(Name="Result")] 
    [WebGet(UriTemplate = "/")] 
    Stream Result(); 
    } 

} 

static void Main() 
{ 

    Console.WriteLine("Press enter when the service is available"); 
    Console.ReadLine(); 

    // creating factory 
    HttpChunkingBinding binding = new HttpChunkingBinding(); 
    binding.MaxReceivedMessageSize = 0x7fffffffL; 

    ChannelFactory<WebServiceClient.IService> factory = new ChannelFactory<WebServiceClient.IService> 
      (binding, new EndpointAddress("http://localhost/WebService/Service")); 

      WebServiceClient.IService service = factory.CreateChannel(); 

     for(int i = 0; i < 10; i++) 
     { 
      Stream s = service.Result(); 
      // write this stream to a file and close the stream 
     } 

      //Closing our channel. 
      ((IClientChannel)service).Close(); 

} 

감사합니다,

+3

포스트 코드 및 예외 메시지 – Juliet

+0

일부 코드를 게시 할 수 있습니까? 또한 웹 서비스를 디버깅하는 좋은 방법은 Fiddler를 사용하여 HTTP 트래픽을 감시하는 것입니다. – Alan

+0

어떤 기술을 사용하고 있습니까? – tster

답변

0

당신은 코드를 게시하지 않은, 그래서 나는 추측 줄거야 :

당신은 열려있는 연결의 최대 수를을 1로 설정하고 루프에서 웹 서비스에 대한 연결을 열지 만 연결의 일부로 연결을 닫지는 않습니다. 이것은 두 번째 반복이 첫 번째 연결에서 시간 초과를 기다리는 상황을 만듭니다 (아마 10 분으로 설정 됨).

+0

당신이 뭔가있는 것 같아요. 그러나 그는 수작업으로 채널을 여는 것이 아닙니다. 가능성이 높습니다. 스트림을 제대로 닫지 않아 연결이 강제로 열립니다. – Aaronaught

0

청킹 채널을 구현하려는 것 같습니다. 구현 방법을 정의한 article을 살펴보십시오.

문서 하단에있는 explains WCF 샘플 프로젝트 설정 방법. 샘플 프로젝트에는 청크 예제가 있습니다.

데이터를 모두 읽지 않아 연결이 닫히지 않았 음을 확신합니다. Chunking이므로 모든 데이터가 동시에 전달되지는 않습니다. 청크를 요청하고 처리 한 다음 다른 청크를 요청합니다.

행운을 빕니다,

패트릭 그냥 추측

+0

FWIW, 내 WCF REST 프로젝트 (이것이 AFAICT)에서 외부 청크 채널 (예 : SDK의 샘플)을 사용할 필요가 없습니다. 스택은 이미 스트림을 승인하고 반환하는 것을 지원합니다. 나를 위해 위대한). FWIW, AFAICT 스트림 인터페이스 (Fiddler로 빠른 확인)를 구현하기 위해 http 청크를 사용하지만 멀리 추상화합니다 :) –

+0

흥미로운 ...이 경우 아마도 @Debby가 대신 WebHttpBinding을 사용할 수 있습니다. 예제 코드에서 사용 된 HttpChunkingBinding. REST 서비스가 Chunking을 백그라운드로 구현하면 작동해야합니다. Try @Debby를 시도해보고 작동하는지 알려주십시오. 귀하의 의견을 주셔서 감사합니다 @ 제임스 매닝 – Patrick

1

하지만, 소리가 종료되지 않은 서비스에 대한 연결 함께 할 수있는 뭔가가 같은 ... 다음 시도 :

for(int i = 0; i < 10; i++) 
    { 
     ChannelFactory<WebServiceClient.IService> factory = 
      new ChannelFactory<WebServiceClient.IService>(
       binding, 
       new EndpointAddress("http://localhost/WebService/Service")); 

     WebServiceClient.IService service = factory.CreateChannel(); 
     using(service as IDsposable) 
     { 
      using(MemoryStream s = service.Result() as MemoryStream) 
      { 
      // write this stream to a file 
      } 
     } 
    }