Windows Phone上的Azure Service Bus中继

时间:2012-05-12 14:00:43

标签: azure windows-phone-7.1 servicebus

我有一个通过windows azure中继的客户端/服务器应用程序。 这适用于服务器和客户端的控制台应用程序。

现在我想将Windows Phone用作客户端,但出于某种原因,我无法调用servicebus。 我无法添加网络参考,在浏览器中定位网址时,我收到以下消息:

<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);

在打开主机之前,我将端点设置为发现模式public。

使用Windows Phone可以或者我还需要做些什么呢?

2 个答案:

答案 0 :(得分:2)

我觉得你很亲密。通过我收集的内容,您无法将Web引用添加到您的手机项目中。虽然通过该路径可以实现,但我不建议通过Relay公开元数据端点,因为您不会在运行时使用它。相反,将合同引用到Windows Phone项目中,并使用BasicHttpBinding创建一个ChannelFactory,并在服务端创建BasicHttpRelatBinding端点的目标地址。

你已经掌握了其他所有内容,包括在监听器上关闭ACS,以便你可以在手机上使用常规的BasicHttpBinding。

编辑:

由于这可能不完全清楚,这是一项服务:

[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”暴露的“侧面”,如果你点击那个URI,它将为你提供WSDL。您可以将该地址与Visual Studio中的“添加Web引用”客户端一起使用,以在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 :(得分:0)

Windows Phone不支持sb协议。所以我们不能使用NetTcpRelayBinding。如果我们想在Windows Phone中使用Service Bus,我们有两个选择:使用BasicHttpRelayBinding或WebHttpRelayBinding。在任何一种情况下,我们都需要通过将RelayClientAuthenticationType设置为None来禁用默认的ACS身份验证:http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.servicebus.relayclientauthenticationtype.aspx。然后在Windows Phone上,我们可以使用内置的BasicHttpBinding来访问SOAP服务,并使用HttpWebRequest来访问REST服务。

最诚挚的问候,

徐明。