2012-05-12 2 views
1

У меня есть приложение клиент/сервер через ретрансляцию через окна azure. Это хорошо работает с использованием консольного приложения для сервера и клиента.Реле Azure Servicebus на Windows Phone

Теперь я хочу использовать Windows Phone в качестве клиента, но по какой-то причине я не могу назвать servicebus. я не могу добавить веб-ссылку и при ориентации на URL в браузере я получаю следующее сообщение:

<s:Fault xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode><faultstring xml:lang="nl-NL">The message with Action 'GET' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring></s:Fault> 

Я ввел следующий код в app.config сервера:

// sb:// binding 
      Uri sbUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "blabla"); 
      var sbBinding = new NetTcpRelayBinding(EndToEndSecurityMode.Transport, RelayClientAuthenticationType.None); 
      serviceHost.AddServiceEndpoint(typeof(IMyContract), sbBinding, sbUri); 

      // https:// binding (for Windows Phone etc.) 
      Uri httpsUri = ServiceBusEnvironment.CreateServiceUri("https", serviceNamespace, "https/" + "blabla"); 
      var httpsBinding = new BasicHttpRelayBinding(EndToEndBasicHttpSecurityMode.Transport, RelayClientAuthenticationType.None); 
      serviceHost.AddServiceEndpoint(typeof(IMyContract), httpsBinding, httpsUri); 

И перед тем, как открыть хост, я устанавливаю конечные точки в открытый режим.

Что еще можно или нужно сделать, чтобы сделать эту работу с телефоном Windows?

ответ

2

Думаю, вы достаточно близко. По тому, что я собираю, вы не можете добавить ссылку на веб-сайт в свой проект телефона. Хотя это возможно по этому пути, я бы не рекомендовал прилагать усилия, чтобы разоблачить конечную точку метаданных через Relay, поскольку вы не будете использовать ее во время выполнения. Вместо этого обратитесь к контракту в проект Windows Phone и создайте ChannelFactory с базовым HttpBinding и адрес назначения для конечной точки BasicHttpRelatBinding на стороне обслуживания.

У вас есть все, что было настроено правильно, что я могу сказать, включая включение ACS на слушателя, чтобы вы могли использовать обычный BasicHttpBinding на телефоне.

EDIT:

Так что, вероятно, было не совсем понятно, вот сервис:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
class Program : IEcho 
{ 
    static void Main(string[] args) 
    { 
     var sh = new ServiceHost(new Program(), 
        new Uri("http://clemensv.servicebus.windows.net/echo")); 
     sh.Description.Behaviors.Add(
      new ServiceMetadataBehavior { 
        HttpGetEnabled = true, 
        HttpGetUrl = new Uri("http://localhost:8088/echowsdl")}); 
     var se = sh.AddServiceEndpoint(typeof(IEcho), 
      new BasicHttpRelayBinding(EndToEndBasicHttpSecurityMode.None, 
             RelayClientAuthenticationType.None), String.Empty); 
     var endpointBehavior = new TransportClientEndpointBehavior(
       TokenProvider.CreateSharedSecretTokenProvider("owner", "...key ...")); 
     se.Behaviors.Add(endpointBehavior); 
     sh.Open(); 
     Console.WriteLine("Service is up"); 
     Console.ReadLine(); 
     sh.Close(); 
    } 

    public string Echo(string msg) 
    { 
     return msg; 
    } 
} 

Контракт IEcho тривиальна и не показано. Вы заметите, что у меня есть ServiceMetadataBehavior, висящий «на стороне», открытый через localhost, который даст вам WSDL, если вы нажмете на этот URI. Вы можете использовать этот адрес с клиентом «Добавить веб-ссылку» в Visual Studio для создания прокси на Windows Phone; этот прокси-сервер будет использовать BasicHttpBinding на телефоне. Я просто сделал это, и она работает, как ожидалось в тривиальном приложении телефон (со ссылкой переименованного MySvc)

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     var client = new MySvc.EchoClient(); 
     client.EchoCompleted += OnClientOnEchoCompleted; 
     client.EchoAsync("foo"); 
    } 

    void OnClientOnEchoCompleted(object sender, EchoCompletedEventArgs c) 
    { 
     this.textBox1.Text = c.Result; 
    } 
+1

Даже я рад видеть, что я в правильном направлении, я не могу понять, как вызвать веб-сервис через basichttpbinding ... Пытаясь использовать обычный вызов, я не могу используйте servicehost и канал, так как версия System.ServiceModel 4.0 недоступна в проекте телефона Windows –

+0

Теперь это работало как шарм! спасибо, все работает сейчас :) –

0

Windows Phone не стоит протоколом сб. Поэтому мы не можем использовать NetTcpRelayBinding. У нас есть два варианта, если мы хотим использовать служебную шину в Windows Phone: используйте BasicHttpRelayBinding или WebHttpRelayBinding. В любом случае нам необходимо отключить аутентификацию ACS по умолчанию, установив для параметра RelayClientAuthenticationType значение None: http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.servicebus.relayclientauthenticationtype.aspx. Затем на Windows Phone мы можем использовать встроенный интерфейс BasicHttpBinding для доступа к SOAP-сервисам и использовать HttpWebRequest для доступа к службам REST.

С наилучшими пожеланиями,

Ming Xu.

+0

У меня есть relayclientauthentication, установленная none в привязке https выше.Проблема в том, что я понятия не имею, как вызвать службу из решения WindowsPhone. –

+0

На самом деле, с использованием служебной шины в Windows Phone аналогично ее использованию в Silverlight. Вы можете найти образец на http://code.msdn.microsoft.com/CSAzureServiceBusSLRest-41878c00. –