2011-09-01 2 views
3

ServiceHost 개체에서 호스팅되는 WCF 서비스가 있습니다. ServiceHost는 Azure Worker 역할의 OnStart 메소드에서 작성됩니다.1 분 이상 호출하면 ServiceBus의 WCF 서비스가 실패합니다.

 ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Http; 

     Uri baseAddress = ServiceBusEnvironment.CreateServiceUri("http", "my_sb", "SimpleService"); 

     host = new ServiceHost(typeof(SimpleService1.Service1), baseAddress); 

     BasicHttpRelayBinding binding = new BasicHttpRelayBinding(EndToEndBasicHttpSecurityMode.None, RelayClientAuthenticationType.None); 
     binding.OpenTimeout = new TimeSpan(1, 1, 0); 
     binding.ReceiveTimeout = new TimeSpan(1, 10, 0); 
     binding.SendTimeout = new TimeSpan(1, 10, 0); 
     binding.MaxReceivedMessageSize = 73400320; 
     XmlDictionaryReaderQuotas readerQuotas = new XmlDictionaryReaderQuotas(); 
     readerQuotas.MaxArrayLength = 73400320; 
     binding.ReaderQuotas = readerQuotas; 

     TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior(); 
     sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret; 

     sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = "owner"; 
     sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = "blablablabla=="; 


     ContractDescription contractDescription = ContractDescription.GetContract(typeof(SimpleService1.IService1), typeof(SimpleService1.Service1)); 
     ServiceEndpoint serviceEndPoint = new ServiceEndpoint(contractDescription); 
     serviceEndPoint.Address = new EndpointAddress(baseAddress); 
     serviceEndPoint.Binding = binding; 

     IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public); 

     serviceEndPoint.Behaviors.Add(serviceRegistrySettings); 
     serviceEndPoint.Behaviors.Add(sharedSecretServiceBusCredential); 


     host.Description.Endpoints.Add(serviceEndPoint); 

     try 
     { 

      host.Open(); 

     } 

     catch (Exception ex) 
     { 

      Trace.WriteLine(ex.Message, "Error"); 

      throw; 

     } 

     Trace.WriteLine("SimpleService1 running..."); 

및 클라이언트 측 바인딩 구성됩니다 : : 문제는 서비스에 대한 하나의 호출이보다 긴 것을 걸리는 경우

 <basicHttpBinding> 
      <binding name="FileTransferBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="73400320"> 
      <readerQuotas maxArrayLength="73400320"/> 
      <security mode="None"/> 
      </binding> 
     </basicHttpBinding> 

<endpoint address="http://my_sb.servicebus.windows.net/simpleservice" binding="basicHttpBinding" bindingConfiguration="FileTransferBinding" contract="Service1reference.IService1" name="FileTransferBinding" behaviorConfiguration="sbBehavior"/> 

여기에 코드입니다 1 분이 지나면 클라이언트는 다음 예외를받습니다.

The content type application/xml; charset=utf-8 of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly 

netTcpRelayBinding 바인딩을 변경하면 모든 것이 정상적으로 작동합니다.

답변

3

연결이 1 분 이상 유휴 상태이면 Windows Azure 부하 분산 장치가 연결을 해제하기 때문입니다.

가장 좋은 방법은 WCF 콜백을 사용하는 것입니다. 이렇게하면 서버에서 클라이언트로 호출이 실행되어 장기 실행 작업이 완료되었음을 알 수 있습니다. 이것을하는 방법에 대한 자세한 내용은이 블로그를보십시오 [WCF Callbacks