2013-07-29 65 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

相关问题