WCF: HTTP 400 Bad Request on self-hosted service

Ik heb deze interface:

  [ServiceContract]
    public interface ILocationService
    {
        [OperationContract]
        bool RegisterForNotification(string name, string uri);

        [OperationContract]
        bool UnRegisterForNotification(string name);
    }

en deze service:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
    public class LocationBasedService : ILocationService
    {
        #region Registrations
        public bool RegisterForNotification(string name, string uri)
        {
            return true;
        }

        public bool UnRegisterForNotification(string name)
        {
            return true;
        }     
        #endregion
    }

en de volgende configuratie:


  
    
      
        
            
    
  

Zelf gehost in een WPF-applicatie met behulp van ServiceHost. De code hiervoor gaat als volgt:

private void startSrv_Click(object sender, RoutedEventArgs e)
        {
            try 
            {
                host = new ServiceHost(typeof(LocationBasedService));
                host.Open();
                AddDiagnosticMessage("service successfully initialized");
                AddDiagnosticMessage(string.Format("{0} is up and running with these end points", host.Description.ServiceType));
                foreach (var se in host.Description.Endpoints)
                    AddDiagnosticMessage(se.Address.ToString());
            }
            catch (TimeoutException ex)
            {
                AddDiagnosticMessage(string.Format("The service operation timeod out. {0}", ex));
            }
            catch (CommunicationException ex)
            {
                AddDiagnosticMessage(string.Format("Could not start host service. {0}", ex));
            }
            catch (Exception ex)
            {
                AddDiagnosticMessage(ex.Message);
            }                  
        }

De service start zonder uitzonderingen. Als ik echter de URL http://localhost: 8000/LocationBasedService naar mijn browser verzend, krijg ik HTTP 400 Bad Verzoek. Als ik probeer een WCF-client te maken met Visual Service Add Service Reference, krijg ik de volgende foutmelding:

'Http://localhost: 8000/LocationBasedService'. Toepassing van inhoudstype/soap + xml; charset = utf-8 werd niet ondersteund door de service http://localhost: 8000/LocationBasedService . De client- en servicebindingen komen mogelijk niet overeen. De externe server heeft een fout geretourneerd: (415) Kan het bericht niet verwerken omdat het inhoudstype 'application/soap + xml; charset = utf-8 'was niet het verwachte type' text/xml; charset = UTF-8' .. Als de service in de huidige oplossing is gedefinieerd, probeer dan de oplossing te bouwen en de servicereferentie opnieuw toe te voegen.

ALS ik de client probeer aan te roepen met behulp van de volgende code, krijg ik een time-outuitzondering.

 private void Button_Click(object sender, RoutedEventArgs e)
        {
            statusMessages.Add(GetFormattedMessage("initiailing client proxy"));
            var ep = new EndpointAddress("http://localhost:8000/LocationBasedService");
                     var proxy = ChannelFactory.CreateChannel(new BasicHttpBinding(), ep);          
            var register = proxy.RegisterForNotification("name1", @"http://google.com");
            if (register)
            {  Console.Writeline(register.ToString()); }
        }

Kan iemand wat inzichten geven over wat ik heb gemist? Dit moest een eenvoudige oefening zijn:!

TIA.

1
Ik heb enige vooruitgang geboekt met het bekijken van metadata door het toevoegen van ServiceMetaData-gedrag, maar kan nog steeds geen service krijgen om te reageren op een eenvoudig clientverzoek zonder time-outs. Dit is alles met standaard BasicHttpBindings.
toegevoegd de auteur Klaus Nji, de bron

1 antwoord

Het Bad HTTP-verzoek is opgelost door deze code toe te voegen:

 host = new ServiceHost(typeof(LocationBasedService), new Uri("http://localhost:8000/LocationBasedService"));

 //Enable metadata publishing.
   ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
   smb.HttpGetEnabled = true;
   smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
   host.Description.Behaviors.Add(smb);

    host.Open();   

Wat betreft time-outs voor services werd dit veroorzaakt door mijn persoonlijke firewall. Ik moest Visual Studio toevoegen aan de lijst met toegestane applicaties.

Terug van weggeweest.

2
toegevoegd
Sprak te snel. Test WCF-client werkt, maar via code kan ik de time-out niet halen.
toegevoegd de auteur Klaus Nji, de bron
Als ik echter mijn client van een andere oplossing gebruik (een ander exemplaar van Visual Studio Express), dan werkt het goed. Vroeger had ik client-testcode in dezelfde WPF-app als Service Host-code, beide met dezelfde app.config.
toegevoegd de auteur Klaus Nji, de bron