2

this example을 수행하려고 시도했습니다 (사이트의 링크 또는 here에서 소스 코드를 다운로드하지만 계속 포함됨) 예

합니다 (AppFabric SDK 및 기타 종속성을 설치 한 후) 다음과 같이 내 절차가있다 :..Azure에서 AppFabric ServiceBus를 사용하여 신뢰할 수있는 역할 간 통신 구현, IObserver 패턴

  1. 소스
  2. AppFabric에 서비스 네임 스페이스를 만들기 다운로드를
  3. I 하나의 작업자 역할이있는 새로운 Windows Azure 프로젝트로 프로젝트를 가져오고 모든 프로젝트가 컴파일되고 기본 Worker Role Run() 메서드가 시작되고 작동하는지 확인하십시오.
  4. InterRoleCommunicationExtension.cs의 GetInterRoleCommunicationEndpoint 메서드를 ServiceNameSpace로, IssuerSecret을 내 AppFabric Service 네임 스페이스 (IssuerName 및 ServicePath는 기본적으로 그대로 유지)에서 구성합니다. 이것은 내 자신의 매개 변수의 하드 배선입니다.
  5. 복사/
  6. 코멘트 아웃 참조 Tracemanager 내 프로젝트의 작업자 역할의 ONSTART() 메소드에 데모에서 "SampleWorkerRole.cs"파일에서 초기화 논리를 붙여 넣습니다. * 데모 코드를 가지고 있지 않는 한 Tracemanager 메소드가 구현되었으며이 테스트가 작동하는 데 중요하지 않습니다. 이러한 참조 중 약 7-10 개가 있습니다 (전체 솔루션에서 찾기 -> "Tracemanager"만 수행).
  7. 빌드가 성공적입니다.
  8. 로컬 Compute Emulator에서 실행하십시오. 나는 (this.interRoleCommunicator = new InterRoleCommunicationExtension(); 초기화 할 수있는 역할 간 통신 인프라의 첫 번째 조각) 새로운 InterRoleCommunicationExtension의 초기화 동안이 테스트를 실행하면

이 오류가 발생합니다 : "값은 null 일 수 없습니다 매개 변수. 이름 : 계약 유형. " 이것으로 조금 드릴링

, 나는 ServiceBusHostFactory.cs에서 다음과 같은 방법 (샘플의 파일 중 하나)까지 실행을 따르

public static Type GetServiceContract(Type serviceType) { Guard.ArgumentNotNull(serviceType, "serviceType");

 Type[] serviceInterfaces = serviceType.GetInterfaces(); 

     if (serviceInterfaces != null && serviceInterfaces.Length > 0) 
     { 
      foreach (Type serviceInterface in serviceInterfaces) 
      { 
       ServiceContractAttribute serviceContractAttr = FrameworkUtility.GetDeclarativeAttribute<ServiceContractAttribute>(serviceInterface); 

       if (serviceContractAttr != null) 
       { 
        return serviceInterface; 
       } 
      } 
     } 

     return null; 
    } 



ServiceType 자리 매개 변수의 Name 속성은 "IInterRoleCommunicationServiceContract,"어떤 데모의 클래스 중 하나이며 IObservable을 확장합니다.

public static IList GetDeclarativeAttributes(Type type) where T : class { Guard.ArgumentNotNull(type, "type");

 object[] customAttributes = type.GetCustomAttributes(typeof(T), true); 
     IList<T> attributes = new List<T>(); 

     if (customAttributes != null && customAttributes.Length > 0) 
     { 
      foreach (object customAttr in customAttributes) 
      { 
       if (customAttr.GetType() == typeof(T)) 
       { 
        attributes.Add(customAttr as T); 
       } 
      } 
     } 
     else 
     { 
      Type[] interfaces = type.GetInterfaces(); 

      if (interfaces != null && interfaces.Length > 0) 
      { 
       foreach (object[] customAttrs in interfaces.Select(iface => iface.GetCustomAttributes(typeof(T), false))) 
       { 
        if (customAttrs != null && customAttrs.Length > 0) 
        { 
         foreach (object customAttr in customAttrs) 
         { 
          attributes.Add(customAttr as T); 
         } 
        } 
       } 
      } 
     } 

     return attributes; 
    }</code><br> 

It is here that the issue arises. After not finding any customAttributes on the "IObservable1" type, it calls type.GetInterfaces(), expecting a return. Even though type is "System.IObservable 1 "이 방법은 빈 배열을 반환 원인 : serviceType.GetInterfaces() 호출은 다음과 같은 코드가 다음 FrameworkUtility.GetDeclarativeAttribute(serviceInterface);으로 전달되는"System.IObservable`1 "인터페이스를 반환 null을 돌려주는 함수와 예외를 발생시키는 위의 메시지를 반환한다.

Publish/Subscribe 메시징 패러다임이 내 응용 프로그램을위한 완벽한 솔루션이라고 생각하므로이 시나리오를 작동하는 데 매우 관심이있다. 누구나이 데모 코드를 AppFabric CAT 팀 자체에서 얻을 수 있었습니까? 아니면 내 오류를 발견 할 수 있습니까? 도움을 주셔서 감사합니다.

답변

3

원본 블로그 게시물에 응답되었습니다 (아래 링크 참조). 문제가 계속 발생하면 알려주십시오. 우리는 최선의 노력으로 샘플을 지원할 것을 약속합니다.

http://blogs.msdn.com/b/appfabriccat/archive/2010/09/30/implementing-reliable-inter-role-communication-using-windows-azure-appfabric-service-bus-observer-pattern-amp-parallel-linq.aspx#comments

+0

내게로 돌아와 줘서 고마워. 귀하의 수정 내용이 내 개발 패브릭 상자에서 작동하는 것 같습니다.내가 Azure에서 실행하고 몇 가지 시나리오에서 어떻게 작동 하는지를 볼 수있을 때 나는 1, 2 주 후에 다시 여기에 게시 할 것입니다. 다시 감사합니다! – user483679