2016-05-23 57 views
0

我有一個WCF服務,其中一切都以編程方式啓動(並需要繼續這樣做),我希望此服務響應[WebGet]屬性。與WebGet的WCF服務不起作用

但是,當我調用其中一個WCF方法時,該服務將返回400錯誤請求。 這最初看起來像是WCF Service Returns 400 error when using WebGetBad Request 400 while accessing WCF Rest service (WebGet)的副本,但這兩個解決方案都添加到web.config,這是我沒有的文件,因爲我需要以編程方式執行所有操作。

我試圖添加一個WebHttpBinding,看起來像端點,但它不能正常工作(我可能不是正確的方式)。下面

的代碼開始沒有錯誤,但是當我嘗試去http://localhost:8765/MyService/MyTest我得到上述400 Bad Request

我缺少什麼?

WCF啓動

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

服務接口

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

服務實現

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

回答

1

我用這個代碼,我寫的初始化和代碼完全啓動我的WCF RESTful服務:

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

我認爲關鍵要我錯過了什麼是'WebServiceHost'並添加一個新的'WebHttpBinding'作爲一個新的端點(帶有空白地址)發送給主機。做這兩件事情使它工作。 – GTHvidsten