2013-08-03 4 views
5

Używam Service Bus dla usług systemu Windows 1.0 na prem (klienci odwołują Microsoft.ServiceBus.dll 1.8.0.0)1.0 i usługi WCF NetMessagingBinding - token dostawcą w stanie zapewnić bezpieczeństwo tokenu

Próbuję dostać działający klient i usługa obsługi klienta usługi NetMessagingBinding.

Po prostu chcę wysłać wiadomość do magistrali usług i wypompować ją do mojej usługi wcf.

W tej chwili mam problemy z złożenia, gdyż nie może znaleźć tokena Provider:

Mam następujący kod:

private const string Issuer = "myIssuerName"; 
    private const string Key = "BBBBBB="; 
    private static readonly Uri ServiceBusEndpointAddress = 
     new Uri("{sb://servicebusdefaultnamespace.servicebus.windows.net/Orders/}"); 

    private static void Main(string[] args) 
    { 
     //SetUp 
     var binding = new NetMessagingBinding(); 
     var contract = ContractDescription.GetContract(typeof (IOrderService), typeof (OrderService)); 

     var transportBehavior = new TransportClientEndpointBehavior(); 
     transportBehavior.TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(Issuer, Key); 

     var endpoint = new ServiceEndpoint(contract, binding, 
              new EndpointAddress(ServiceBusEndpointAddress.AbsoluteUri)); 
     endpoint.Behaviors.Add(transportBehavior); 

     var host = new ServiceHost(typeof (OrderService), ServiceBusEndpointAddress); 
     host.AddServiceEndpoint(endpoint); 

     host.Open(); 


     //send message to queue 

     var factory = new ChannelFactory<IOrderService>(endpoint); 
     var client = factory.CreateChannel(); 

     var order = new Order(); 
     order.OrderId = 42; 

     //this is where the exception is raised 
     client.ProcessOrder(order); 
     factory.Close(); 

     Console.ReadLine(); 
    } 

// moja klasa kolejność wygląda następująco:

[ServiceContract()] 
public interface IOrderService 
{ 
    [OperationContract(IsOneWay = true)] 
    void ProcessOrder(Order order); 
} 

[DataContract()] 
public class Order 
{ 
    [DataMember] 
    public Int64 OrderId; 
} 

Ale gdy próbuję wysłać do kolejki (client.ProcessOrder (zlecenia);)

otrzymuję 502:

unauthorisedaccessexception 
    The token provider was unable to provide a security token while accessing 
'https://servicebusdefaultnamespace-sb.accesscontrol.windows.net/WRAPv0.9/'. Token 
    provider returned message: 'The remote name could not be resolved:  'servicebusdefaultnamespace-sb.accesscontrol.windows.net''. 
The remote name could not be resolved: 'servicebusdefaultnamespace- sb.accesscontrol.windows.net' 

at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) 
at System.Net.HttpWebRequest.GetRequestStream() 
at Microsoft.ServiceBus.TokenProviderHelper.GetAccessTokenCore(Uri requestUri, String 
appliesTo, String requestToken, String simpleAuthAssertionFormat, TimeSpan timeout, 
    String& expiresIn) 

Skrzypek mówi mi:

[Fiddler] DNS Lookup for "servicebusdefaultnamespace-sb.accesscontrol.windows.net" failed. The requested name is valid, but no data of the requested type was found       

Więc zastanawiałem się, na czym polega problem:

  1. Czy sb: //servicebusdefaultnamespace.servicebus. windows.net/Orders/ poprawny identyfikator URI, aby skonfigurować punkt końcowy na ?. Pytam o to, ponieważ kiedy się dostać-sbClientConfiguration - mój ciąg połączenia jest:

    Endpoint=sb://myPC/ServiceBusDefaultNamespace; 
        StsEndpoint=https://myPC:9355/ServiceBusDefaultNamespace; 
        RuntimePort=9354;ManagementPort=9355 
    
  2. Czy jest to fakt, że nie mogę używać sharedsecret na prem? (Wolę używać tej metody uwierzytelniania)

Czy ktoś może zauważyć problem?

Dzięki za pomoc

Odpowiedz

3

Właśnie to działało!

Były dwie rzeczy błędne: Jedna myślę, dodając obszar nazw servicebus.windows.net, który próbowałem wywołać do dostawcy tokena błękitnego.

  1. Zamiast więc stworzyłem windowsTokenProvider i URI było STS adres

    https://mypc:9355/ServiceBusDefaultNamespace 
    

można znaleźć przez uruchomienie tej PowerShell cmd:

get-sbclientconfiguration 
  1. Następnie zmieniłem adres punktu końcowego usługi na: (dropp ing servicebus.windows.netto)

    sb://mypcname/servicebusdefaultnamespace/Orders 
    

i jest teraz publikowania Autobus wahadłowy.

Oto ostateczny kod:

private static void Main(string[] args) 
    { 

     var ServiceBusEndpointAddress = new Uri("sb://mypc/servicebusdefaultnamespace/Orders"); 

     //SetUp 
     var binding = new NetMessagingBinding(); 
     var contract = ContractDescription.GetContract(typeof (IOrderService), typeof (OrderService)); 
     var uri = new Uri("https://mypc:9355/ServiceBusDefaultNamespace"); 
     var uris = new List<Uri> { uri }; 
     // Get credentials as Endpoint behavior 
     var securityBehavior = new TransportClientEndpointBehavior 
      { 
       TokenProvider = TokenProvider.CreateWindowsTokenProvider(uris) 
      }; 

     var endpoint = new ServiceEndpoint(contract, binding, 
              new EndpointAddress(ServiceBusEndpointAddress)); 
     endpoint.Behaviors.Add(securityBehavior); 

     var host = new ServiceHost(typeof(OrderService), uri); 
     host.AddServiceEndpoint(endpoint); 

     host.Open(); 


     //Client 

     var factory = new ChannelFactory<IOrderService>(endpoint); 
     var client = factory.CreateChannel(); 

     var order = new Order(); 
     order.OrderId = 42; 

     client.ProcessOrder(order); 
     factory.Close(); 

     Console.ReadLine(); 
    } 
Powiązane problemy