2015-02-05 2 views
2

2 개의 서로 다른 서비스 버스 항목을 가리키는 두 개의 끝점이 정의되어 있습니다. 동일한 transportClientEndpointBehavior와 동일한 서비스를 사용합니다. 내가 응용 프로그램을 실행하면WCF 끝점에서 동일한 Windows 서버 서비스 버스 네임 스페이스 내에서 두 개의 서로 다른 주제가 있음

<endpointBehaviors> 
      <behavior name="securityBehavior"> 

      <transportClientEndpointBehavior> 
      <tokenProvider> 
       <windowsAuthentication> 
       <stsUris> 
        <stsUri value="https://on-permises:9355/Namespace" /> 
       </stsUris> 
       </windowsAuthentication> 
      </tokenProvider> 
      </transportClientEndpointBehavior> 
</endpointBehaviors> 

<customBinding> 
     <binding name="messagingBinding" > 
      <textMessageEncoding messageVersion="None" writeEncoding="utf-8" > 
      <readerQuotas maxStringContentLength="2147483647"/> 
      </textMessageEncoding> 
      <netMessagingTransport/> 
     </binding> 
</customBinding> 

<endpoint name="endpoint1" 
      address="sb://on-permises/Namespace/topic1" 
        listenUri="sb://on-permises/Namespace/topic1/subscriptions/sub" 
        binding="customBinding" 
        bindingConfiguration="messagingBinding" 
        contract="WCFService.IService1" 
        behaviorConfiguration="securityBehavior" /> 

     <endpoint name="endpoint2" 
      address="sb://on-permises/Namespace/topic2" 
        listenUri="sb://on-permises/Namespace/topic2/subscriptions/sub" 
        binding="customBinding" 
        bindingConfiguration="messagingBinding" 
        contract="WCFService.IService2" 
        behaviorConfiguration="securityBehavior" /> 

, 나는 오류가 발생합니다 : System.ArgumentException를 'Microsoft.ServiceBus : 컬렉션이 이미 동일한 유형의 항목을 포함 같이 값이 컬렉션에 추가 할 수 없습니다. TransportClientEndpointBehavior '를 호출하십시오. 이 컬렉션은 각 유형의 인스턴스 하나만 지원합니다. 매개 변수 이름 : 항목

두 가지 다른 끝점 동작을 정의했지만 동일한 오류가 발생했습니다. 여기에 도움이 될 것입니다.

답변

0

해결 방안을 찾았는데 서비스 호스트가 WSDL/Metadata에서이 두 서비스 끝점을 추가하려고 할 때 문제가 발생했습니다. 그것은 필요하지 않았다. 따라서 ServiceMetadataContractBehavior (IContractBehavior)를 사용하여 WSDL/메타 데이터 노출이 중단되었습니다.

더 나은 방법이나 수정 사항은 알려 주시기 바랍니다. 실제로 IContractBehavior를 구현하지 않는 한 위의 답변이 완료되지 않았 음을

public class DisableContractMetadata : Attribute, IContractBehavior 

    { 

     public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 

     { 

     } 


     public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime) 

     { 



     } 


     public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) 

     { 

      /// Here ServiceMetadataContractBehavior type is derived from IContractBehavior 

      /// MetadataGenerationDisabled property of ServiceMetadataContractBehavior type = flase disables disables exposing WSDL 

      contractDescription.ContractBehaviors.Add(new ServiceMetadataContractBehavior() { MetadataGenerationDisabled = true }); 

     } 


     public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint) 

     { 



     } 

    } 
0

참고. 이 같이

여러 호스팅 서비스로 인해 발생합니다, 당신은 또한 호스트에서 작업을 수행 할 수 있습니다 당신이 유형에 여러 개의 계약이있는 경우,

ContractDescription contractDescription = ContractDescription.GetContract(typeof(MyService)); 
contractDescription.ContractBehaviors.Add(new ServiceMetadataContractBehavior() { MetadataGenerationDisabled = true }); 

을 또는이 사용

private static void DisableMetadataGeneration(Type serviceType) 
{ 
    // prevent this error due to hosting multiple services: 
    // System.ArgumentException: The value could not be added to the collection, as the collection already contains an item of the same type: 'Microsoft.ServiceBus.TransportClientEndpointBehavior'. This collection only supports one instance of each type. 
    foreach (Type contractType in GetContracts(serviceType)) 
    { 
     ContractDescription contractDescription = ContractDescription.GetContract(contractType, serviceType); 
     contractDescription.ContractBehaviors.Add(new ServiceMetadataContractBehavior() { MetadataGenerationDisabled = true }); 
    } 
} 

private static Type[] GetContracts(Type serviceType) 
{ 
    System.Diagnostics.Debug.Assert(serviceType.IsClass); 

    Type[] interfaces = serviceType.GetInterfaces(); 

    List<Type> contracts = new List<Type>(); 

    foreach (Type type in interfaces) 
    { 
     if (type.GetCustomAttributes(typeof(ServiceContractAttribute), false).Any()) 
     { 
      contracts.Add(type); 
     } 
    } 

    return contracts.ToArray(); 
} 
관련 문제