Ich versuche, das Echo-Beispiel zwischen zwei Computern in meinem lokalen Netzwerk auszuführen. Das Beispiel verwendet das NetTcpRelayBinding und es funktioniert einwandfrei, wenn ich den Dienst und den Client auf demselben Computer ausführen. Als ich zuerst die Dienste kompilierte und sie auf meine andere Maschine legte, wurde ein Windows 2003 Server ohne dev tools installiert. Es würde nicht ausgeführt, weil es nicht wusste, was NetTcpRelayBinding in der app.config war. Also habe ich die Konfiguration nur auf Code umgestellt und der Dienst gestartet. Das habe ich mit dem Service Bus Explorer bestätigt. Ich habe dann versucht, mit meinem Rechner (über VS2010) zu verbinden, aber es wird nicht funktionieren. Ich habe versucht, sowohl den Service als auch den Client zu ändern, indem ich alle möglichen Kombinationen von Einstellungen ausprobiere, aber nichts. Ich bekomme meistens einen von zwei Fehlern auf dem Client:Azure AppFabric Service Bus Echo-Beispiel funktioniert nicht
"ContractDescription 'IEchoContract' hat null Operationen; ein Vertrag muss mindestens eine Operation haben."
oder
„gab es keinen Endpunkt hören, der die Nachricht übernehmen könnte“.
Dies ist der Servercode, meine Änderung liegt zwischen den benutzerdefinierten Kommentaren.
// create the service URI based on the service namespace
Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
// create the credentials object for the endpoint
TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior();
sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret;
sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName;
sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret;
// create the service host reading the configuration
ServiceHost host = new ServiceHost(typeof(EchoService), address);
// custom
host.AddServiceEndpoint(
typeof(IEchoContract),
new NetTcpRelayBinding(),
"EchoService");
// custom end
// create the ServiceRegistrySettings behavior for the endpoint
IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
// add the Service Bus credentials to all endpoints specified in configuration
foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
{
endpoint.Behaviors.Add(serviceRegistrySettings);
endpoint.Behaviors.Add(sharedSecretServiceBusCredential);
}
// open the service
host.Open();
Dies ist der Client-Code, ist mein aktueller Wechsel zwischen den benutzerdefinierten Kommentaren:
// create the service URI based on the service namespace
Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
// create the credentials object for the endpoint
TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior();
sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret;
sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName;
sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret;
// create the channel factory loading the configuration
//ChannelFactory<IEchoChannel> channelFactory = new ChannelFactory<IEchoChannel>("RelayEndpoint", new EndpointAddress(serviceUri));
// custom
ServiceEndpoint endpoint = new ServiceEndpoint(new ContractDescription("IEchoContract", "Microsoft.ServiceBus.Samples"), new NetTcpRelayBinding(EndToEndSecurityMode.Transport, RelayClientAuthenticationType.None), new EndpointAddress(serviceUri));
ChannelFactory<IEchoChannel> channelFactory = new ChannelFactory<IEchoChannel>(endpoint);
// custom end
// apply the Service Bus credentials
channelFactory.Endpoint.Behaviors.Add(sharedSecretServiceBusCredential);
// create and open the client channel
IEchoChannel channel = channelFactory.CreateChannel();
channel.Open();
Meine app.config-Dateien der Einstellungen gelöscht werden. Ich habe keine anderen Dateien berührt.