2013-07-29 94 views
0

我正嘗試構建自託管的WCF RESTful(Json)服務器。 按照一些分步教程,在請求http://192.168.1.250:18688/MyService/GetJSON在提琴手後返回錯誤400。 有人說在這種情況下,需要SVC文件的修改,但實際上自託管應用程序中沒有這樣的文件。WCF REST自託管返回400錯誤請求

如何解決?謝謝!

接口

namespace Contracts 
{ 
    [ServiceContract] 
    public interface IMyService 
    { 
     [OperationContract] 
     [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "Ping")] 
     bool Ping(); 
     [OperationContract] 
     Dude GetDude(); 
     [OperationContract] 
     [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetJSON")]//,BodyStyle=WebMessageBodyStyle.Bare)] 
     string GetDudeJSON(); 
    } 
} 

代碼

namespace Contracts 
{ 
    [ServiceBehavior] 
    public class MyService:IMyService 
    { 
     public Dude Dummy { get; set; } 
     public MyService() 
     { 
      Dummy = new Dude("Dude", 28); 
     } 


     public bool Ping() 
     { 
      return true; 
     } 

     public Dude GetDude() 
     { 
      return Dummy; 
     } 

     string IMyService.GetDudeJSON() 
     { 
      MemoryStream stream = new MemoryStream(); 
      DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Dude)); 
      ser.WriteObject(stream,Dummy); 
      stream.Position = 0; 
      StreamReader reader = new StreamReader(stream); 
      // Console.WriteLine("Read:"+reader.ReadToEnd()); 
      return reader.ReadToEnd(); 
     } 
    } 
} 

的app.config

<?xml version="1.0"?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="Contracts.MyService" behaviorConfiguration="MEXBehavior"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding1" contract="Contracts.IMyService"></endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint> 
     <host> 
      <baseAddresses>   
      <add baseAddress="http://192.168.1.250:18688/MyService"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <!-- A behavior definition for MEX --> 
    <behaviors> 
     <serviceBehaviors> 

     <behavior name="MEXBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <serviceMetadata/> 
     </behavior>   
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="httpBinding1"></binding> 
     </basicHttpBinding>  
    </bindings> 
    </system.serviceModel> 

    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
</configuration> 

CLI主機

static void Main(string[] args) 
     { 
      ServiceHost _host = new ServiceHost(typeof(Contracts.MyService)); 
      _host.Open();   
      ChannelFactory<Contracts.IMyService> channel = new ChannelFactory<Contracts.IMyService>(
                      new BasicHttpBinding(), 
                      new EndpointAddress("http://192.168.1.250:18688/MyService")); 
      Contracts.IMyService client = channel.CreateChannel(); 
      while (true) 
      { 
       ; 
      } 
     } 
+0

您應該查看HTTP請求和響應。如果他們不提供即時答案,請將其添加到問題中。 –

回答

0

basicHttpBinding用於基於SOAP的通信。對於REST,您必須使用webHttpBinding

您的服務端點改成這樣:

<endpoint address="" binding="webHttpBinding" contract="Contracts.IMyService" behaviorConfiguration="MyRestBehavior" /> 

你一定注意到,我添加了一個終結點行爲配置參考。定義它在你的<behaviors>部分:

<endpointBehaviors> 
    <behavior name="MyRestBehavior"> 
     <webHttp /> 
    </behavior> 
</endpointBehaviors> 

一旦你這樣做,沒有必要手動使用DataContractJsonSerializer。您可以更改接口有:

Dude GetDudeJSON(); 

和實施:

Dude IMyService.GetDudeJSON() 
{ 
    return new Dude("Dude", 28); 
} 

您將自動收到以JSON格式的對象。

請注意 - 您的while (true) { ; }是非常糟糕的阻塞方式 - 它會佔用您的CPU週期。相反,只需使用一些阻止呼叫,如Console.ReadLine()

+0

謝謝!這樣一個詳細的答案,我正在嘗試這個,稍後反饋。而(真)是另一個驚喜,絕對是一個錯誤的例子,它確實花了很多CPU的負擔,所以我現在發現它,真的很感激點出來:D – Alex

+0

WOW它的工作原理!再次感謝!:D – Alex

相關問題