2016-05-23 2 views
0

Ich habe einen WCF-Dienst, bei dem alles programmgesteuert gestartet wird (und muss dies weiterhin tun), und ich möchte, dass dieser Dienst auf [WebGet] Attribute reagiert.WCF-Dienst mit WebGet funktioniert nicht

Wenn ich jedoch eine der WCF-Methoden aufrufen, gibt der Dienst eine 400 ungültige Anforderung zurück. Dies würde zunächst wie ein Duplikat von WCF Service Returns 400 error when using WebGet oder Bad Request 400 while accessing WCF Rest service (WebGet) scheinen, aber beide Lösungen hinzufügen, web.config, eine Datei, die ich nicht habe, weil ich alles programmgesteuert tun muss.

Ich habe versucht, eine WebHttpBinding zu hinzufügen, was wie der Endpunkt scheint, aber es funktioniert nicht richtig (ich mache es wahrscheinlich nicht den richtigen Weg).

Der Code beginnt unten ohne Fehler, aber wenn ich zu http://localhost:8765/MyService/MyTest gehen versuchen, erhalte ich die oben genannten 400 Bad Request

Was bin ich?

WCF Starter

MyService myService = new MyService(); 
ServiceHost host = new ServiceHost(myService, new Uri("http://localhost:8765/MyService")); 
ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>(); 
behavior.InstanceContextMode = InstanceContextMode.Single; 

foreach(ServiceEndpoint endpoint in host.Description.Endpoints) { 
    endpoint.Binding = new WebHttpBinding(); 
} 

host.Open(); 

Service-Schnittstelle

[ServiceContract] 
public interface IMyService { 
    [OperationContract] 
    [WebGet] 
    string MyTest(); 
} 

Service-Implementierung

public class MyService : IMyService { 
    public string MyTest() { 
     return "Response from WCF service"; 
    } 
} 

Antwort

1

Ich benutze diesen Code schrieb ich meine WCF geruhsamen Dienste zu initialisieren und starten vollständig von Code:

public static WebServiceHost InitializeAndStartWebServiceHost(int port, string endPointName, object serviceModel, Type implementedContractType) { 
     var baseAddress = new Uri($"http://0.0.0.0:{port}/{endPointName}"); 
     WebServiceHost host; 
     try { 
      host = new WebServiceHost(serviceModel, baseAddress); 
     } catch (Exception exception) { 
      Debug.Print("Error when creating WebServiceHost, message: " + exception.Message); 
      return null; 
     } 

     // ReSharper disable once UseObjectOrCollectionInitializer 
     var binding = new WebHttpBinding(); 
     binding.UseDefaultWebProxy = false; 
     binding.BypassProxyOnLocal = true; 

     //By default, TransferMode is Buffered which causes C# wcf client to be slow as hell (>500ms for requests which give >2kB responses). 
     //I am not exactly sure why this helps, but it helps! 
     binding.TransferMode = TransferMode.Streamed; 

     host.AddServiceEndpoint(implementedContractType, binding, ""); 
     var behavior = new WebHttpBehavior(); 
     behavior.HelpEnabled = false; 
     behavior.DefaultBodyStyle = WebMessageBodyStyle.Bare; 
     // We will use json format for all our messages. 
     behavior.DefaultOutgoingRequestFormat = WebMessageFormat.Json; 
     behavior.DefaultOutgoingResponseFormat = WebMessageFormat.Json; 
     behavior.AutomaticFormatSelectionEnabled = false; 
     behavior.FaultExceptionEnabled = true; 


     host.Description.Endpoints[0].Behaviors.Add(behavior); 

     try { 
      host.Open(); 
     } catch (AddressAccessDeniedException) { 
      Console.WriteLine(@"Application must run with administrator rights."); 
      Console.ReadKey(); 
      Environment.Exit(0); 
     } 
     return host; 
    } 
+1

Ich denke, der Schlüssel zu dem, was ich fehlte, war 'WebServiceHost' und das Hinzufügen eines neuen' WebHttpBinding' als neuer Endpunkt (mit einer leeren Adresse) an den Host. Diese beiden Dinge zu tun, hat es funktioniert. – GTHvidsten