2013-09-01 6 views
2

Windows Service Bus 1.0 Brokered 메시징의 간단한 구현을 사용하여 특정 웹 응용 프로그램과의 사용자 상호 작용을 추적합니다.ServiceBus가 401 Unauthorized Error를 던졌습니다

ServiceBus.MessageQueue<T>.PushAsync(entity); 

다음 개체를 직렬화하고 밖으로 메시지를 만들 것이다 :

뭔가가 데이터베이스에 "민감한"테이블에 저장 될 때마다, 나는 저장소 층과 같이 메시지를 보내 설정을 가지고 그것.

MessageQueue 클래스는 다음과 같습니다.

public static class MessageQueue<T> 
{ 
    static string ServerFQDN; 
    static int HttpPort = 9355; 
    static int TcpPort = 9354; 
    static string ServiceNamespace = "ServiceBusDefaultNamespace"; 

    public static void PushAsync(T msg) 
    { 
     ServerFQDN = System.Net.Dns.GetHostEntry(string.Empty).HostName; 

     //Service Bus connection string 
     var connBuilder = new ServiceBusConnectionStringBuilder { ManagementPort = HttpPort, RuntimePort = TcpPort }; 
     connBuilder.Endpoints.Add(new UriBuilder() { Scheme = "sb", Host = ServerFQDN, Path = ServiceNamespace }.Uri); 
     connBuilder.StsEndpoints.Add(new UriBuilder() { Scheme = "https", Host = ServerFQDN, Port = HttpPort, Path = ServiceNamespace}.Uri); 

     //Create a NamespaceManager instance (for management operations) and a MessagingFactory instance (for sending and receiving messages) 
     MessagingFactory messageFactory = MessagingFactory.CreateFromConnectionString(connBuilder.ToString()); 
     NamespaceManager namespaceManager = NamespaceManager.CreateFromConnectionString(connBuilder.ToString()); 

     if (namespaceManager == null) 
     { 
      Console.WriteLine("\nUnexpected Error"); 
      return; 
     } 

     //create a new queue 
     string QueueName = "ServiceBusQueueSample"; 
     if (!namespaceManager.QueueExists(QueueName)) 
     { 
      namespaceManager.CreateQueue(QueueName); 
     } 

     try 
     {    
      QueueClient myQueueClient = messageFactory.CreateQueueClient(QueueName); 

      string aaa = JsonConvert.SerializeObject(msg, Formatting.Indented, 
          new JsonSerializerSettings() 
          { 
           ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
           ContractResolver = new NHibernateContractResolver() 
          }); 

      BrokeredMessage sendMessage1 = new BrokeredMessage(aaa); 
      sendMessage1.Properties.Add("UserName",Thread.CurrentPrincipal.Identity.Name); 
      sendMessage1.Properties.Add("TimeStamp", ApplicationDateTime.Now); 
      sendMessage1.Properties.Add("Type", msg.GetType().Name); 


      myQueueClient.Send(sendMessage1); 

     } 
     catch (Exception e) 
     { 
      var l = new Logger(); 
      l.Log(LogEventEnum.WebrequestFailure, e.Message); 
      Console.WriteLine("Unexpected exception {0}", e.ToString()); 
      throw; 
     } 

    } 
} 

로컬로 디버깅 할 때 완벽하게 작동합니다. 그러나 IIS에서 사이트를 게시하고 실행하면 namespaceManager.QueueExists(QueueName) 호출이 실패하고 "401 Unauthorized error"예외가 발생합니다.

관리자 계정으로 응용 프로그램 풀 ID (IIS에서)를 변경하면이 오류가 발생하지 않습니다. 그러나, 우리가 생산에 갈 때 이것이 일어날 수있는 방법은 절대적으로 입니다.

내가 누락 된 항목이 있습니까? 그렇다면 무엇입니까? 어떤 도움이라도 대단히 감사합니다.

답변

3

Chameera 문서의 보안 섹션을 읽었습니까? http://msdn.microsoft.com/en-us/library/windowsazure/jj193003(v=azure.10).aspx

기본 보안 설정으로 실행되는 것으로 보입니다. 즉, 관리자 계정 만 승인 된 것입니다. 설명서 섹션을 검토하고 prod에서 사용할 계정에 필요한 권한을 부여하십시오.

+0

감사합니다. Clemens에게 감사드립니다. 나는 그 모든 것을 놓친 것 같습니다. 이것은 논리적 인 수정이라고 생각하여 아직 이것을 테스트하지는 않았지만 이것을 답으로 표시 할 것입니다. –

관련 문제